编程语言
首页 > 编程语言> > java基础学习笔记 - 面向对象课时1

java基础学习笔记 - 面向对象课时1

作者:互联网

p67 封装详解

1、封装的好处:
1)程序设计要追求“高内聚 低耦合”,高内聚就是类的内部数据操作细节自己完成,不许外部干涉;低耦合即仅暴露少量的方法给外部使用
2)复杂性封装,只对外提供简单的操作入口, 隐藏代码的实现细节,看不到实物复杂的那一面,只展示事物简单的一面
3)封装之后形成真正的“对象”,真正的“独立体”,增强了系统的可维护性
4)封装之后提高了代码的安全性,保护了数据
5)封装意味着有统一接口,程序可以重复使用,适应性强

2、封装的实现:属性私有-get/set
1)类的所有属性私有化,外部程序不能直接访问,使用private关键字修饰,private修饰的数据只能在当前类中访问
2)对外提供简单的操作入口,以后外部程序想要方问对象,必须通过这些简单的入口进行访问:
  - 对外提供两个公开的方法作为入口,get/set方法
  - set/get方法必须是 public修饰的
  - 调用set方法修改属性,set方法只负责修改数据,没有返回值,通过传参修改实例变量的值
  - 调用get方法读取属性,有返回值类型,get方法负责返回该类型的数据
  - 可以在get/set的方法体中进行安全过滤

3、get/set 的语法:

    public 返回值类型 getName(){return field;}
    public void setName(形参){ }

    public returntype getName(){
      return field;  }

    public void setName(type variable){
      this.field = value;
      ... ...   }

  //示例3-1

 

public class D03{
    public static void main(String[] args){
        
        Student s = new Student();
        
        //通过方法传参设置值
        s.setName("小明",13,'男');
        
        //打印返回的数据
        System.out.println(s.getName());
        System.out.println(s.getAge());
        System.out.println(s.getSex());
        
    }
}


//Student类
public class Student{
    
    //属性私有
    private String name;
    private int age;
    private char sex;
    
    //提供一些可以操作类的属性的方法
    //提供一些 public的 get、set方法
    //给数据设置值
    public void setName(String name,int age,char sex){
        this.name = name;
        this.age = age;
        this.sex = sex;
    }    
    
    //获取这个数据
    public String getName(){
        return this.name;
    }
    public int getAge(){
        return this.age;
    }
    public char getSex(){
        return this.sex;
    }
}
View Code

 //示例3-2:构造器测试,重载,get/set测试

 

//构造器类
public class Constructor{
    
    public static void main(String[] args){
        
        //调用无参构造
        Account act1 = new Account();
        
        //通过入口访问对象的属性
        System.out.println("账号:" + act1.getActno());
        System.out.println("余额:" + act1.getBalance());
        
        //调用有参构造
        Account act2 = new Account("110",10000);
        
        //访问对象的属性
        System.out.println("账号:" + act2.getActno());
        System.out.println("余额:" + act2.getBalance());
        
        //通过入口修改对象的属性
        act2.setActno("act-110");
        act2.setBalance(200000);
        System.out.println("账号:" + act2.getActno());
        System.out.println("余额:" + act2.getBalance());
    }
}


//定义账户类
public class Account{
    
    private String actno;
    private double actbalance;
    
    //构造方法重载
    //构造方法初始化实例变量手动或默认
    public Account(){
        //actno = null;
        //actbalance = 0.0;
    }
    
    public Account(String s){
        actno = s;
        //actbalance = 0.0;
    }
    
    public Account(double d){
        //actno = null;
        actbalance = d;
    }
    
    public Account(String s, double d){
        actno = s;
        actbalance = d;
    }
    
    //访问入口get/set
    public String getActno(){
        return actno;
    }
    public void setActno(String actno){
        this.actno = actno;
    }
    
    public double getBalance(){
        return actbalance;
    }
    public void setBalance(double balance){
        this.actbalance = balance;
    }
}
View Code

 


 

p68 继承 extends关键字
  - 继承是类和类之间的一种关系,此外类和类之间的关系还有依赖、组合、聚合等
  - 继承的本质是对一批类的抽象,从而实现对现实世界更好的建模
  - 继承关系的两个类,子类是派生类,父类的基类
  - 子类继承父类,子类是父类的扩展,子类拥有父类的全部的属性和方法
  - java中类只有单继承没有多继承,一个子类只能继承一个父类,一个父类可以扩展多个子类
  - java中所有的类都默认继承 Object类

    public class 子类名 extends 父类名{ }

2、有 final 修饰的类将不能被继承
如:pubic final class person{} //该类将不能被继承

 示例4:

 

public class D04{
    public static void main(String[] args){
        
        Student student = new Student();
        
        student.say();            //说了一句话
        System.out.println(student.money);    //10_0000_0000
    }
}


//Person类
public class Person{
    
    public int money = 10_0000_0000;
    
    public void say(){
        System.out.println("说了一句话");
    }
}


//Student类
public class Student extends Person{}
View Code

 


 

 p70 重写override

1、重写与父类引用的逻辑
  - 在继承关系中,子类可以重写父类的方法,属性不存在重写
  - 重写的方法通常是非静态的、public的
  - 父类型的引用可以指向子类对象,但子类的引用不能指向父类对象
  - 父类型的引用指向子类对象,相当于创建了一个新的隐藏的子类型的对象,但它没有该子类的元素,而是只继承父类的所有属性和方法,被重写的方法在这里被覆盖,因此通过父类引用调用重写的方法,相当于调用了子类的方法,父类引用也无法真正访问子类对象
  - 如果重写的方法是静态的,父类的引用仍然调用父类的方法,静态的方法无法被重写

2、重写的语法
  - 重写的方法名、参数列表都必须相同
  - 重写的方法体不同,执行的功能不同
  - 修饰符:范围可以扩大但不能缩小 public>protected>default>private
  - 抛出的异常:范围可以被缩小但不能扩大 ClassNotFoundException < Exception
3、为什么需要重写
  - 父类的功能,子类不一定需要或者不一定满足

4、以下情况不能重写:
  - static 修饰的方法
  - private 修饰的方法
  - final 定义的常量

 //示例7-1:重写静态方法的调用

public class T07{
    public static void main(String[] args){
        
        A a = new A();
        B b = new A();
        
        a.test();  //相当于A.test();
        b.test();  //相当于B.test();
    }
}


//子类重写父类的方法
public class A extends B{
    public static void test(){
        System.out.println("A=>test()");
    }
}


//父类
public class B{
    public static void test(){
        System.out.println("B=>test()");
    }
}
View Code

 //示例7-2:重写非静态方法的调用

public class T07{
    public static void main(String[] args){
        
        A a = new A();
        B b = new A();
        //非静态方法的重写,通过引用调用的方法是对象的方法
        a.test();  //A=>test()
        b.test();  //A=>test()
    }
}


//子类重写
public class A extends B{
    public void test(){
        System.out.println("A=>test()");
    }
}


//父类
public class B{
    public void test(){
        System.out.println("B=>test()");
    }
}
View Code

 //示例7-3:重写的辩证 父类引用指向子类对象的情况

public class T07{
    public static void main(String[] args){
        //非静态方法的重写
        A a = new A();
        B b = new A();    //相当于隐藏创建了一个父类对象
        
        //重写方法时,父类的引用默认调用子类的方法
        a.test();  //A=>test()
        b.test();  //A=>test()
        
        //显示创建父类对象,调用被重写的父类方法
        B c = new B();
        c.test();  //b=>test()
        
        //不能调用子类独有的方法
        //b.test1();
        
        //可以访问父类的属性 、方法
        System.out.println(b.name);        
        b.test2();
    }
}


//子类继承父类
public class A extends B{
    
    //重写方法
    public void test(){
        System.out.println("A=>test()");
    }
    
    //独有方法
    public void test1(){
        System.out.println("A1=>test()");
    }
}


//父类
public class B{
    
    String name;
    
    public void test(){
        System.out.println("B=>test()");
    }
    
    public void test2(){
        System.out.println("B2=>test()");
    }
}
View Code

 


 

p71 多态:
  - 多态是方法的现象,属性没有多态性
  - 多态存在于有继承关系的类中,父类引用指向子类对象
  - 一个对象的实际类型是确定的,但指向它的引用的类型可以有多个父类类型
  - 子类能调用的方法都是它自己的或者继承父类的
  - 父类型的引用可以指向子类对象,但是不能调用子类独有的属性和方法,只能调用子类重写的方法
  - 用强制转换类型的办法,使父类引用s2的类型降级,就可以得到一个指向子类对象的子类引用,这时该引用可以完全访问子类对象

例:Student s1 = new Student();
  Person s2 = new Student();
  Object s3 = new Student();
  ((Student)s2).eat();

 //示例8:

 

//测试类
public class T08{
    public static void main(String[] args){
        
        //指向对象的引用类型是多种的
        Student s1 = new Student();
        Person s2 = new Student();
        Object s3 = new Student();
        
        s1.run();    //Student run
    
        //子类重写了父类run()方法,S2默认调用子类的方法
        s2.run();    //Student run
        
        //s2不能调用子类独有的方法
        //s2.eat();
        
        //用强制转换类型的办法,使s2类型降级,可以访问子类对象,可能会丢失什么
        ((Student)s2).eat();
    }
}


//子类
public class Student extends Person{
    
    //重写run()方法
    public void run(){
        System.out.println("Student run");
    }
    
    //子类的独有方法
    public void eat(){
        System.out.println("Student eat");
    }
}


//父类
public class Person{
    
    public void run(){
        System.out.println("Person run");
    }
}
View Code

 

 

 

 

//即使再小的帆也能远航2021-11-13

标签:java,子类,void,课时,面向对象,test,父类,重写,public
来源: https://www.cnblogs.com/hongmeiaoxue/p/15549169.html