java学习记录九:面向对象:对象的继承

一、匿名对象

1.匿名对象解释

没有变量接收的新创建的对象,只能使用一次。

2.格式

 //匿名对象
        new Student("aa",18).show();// 没有名字的对象,调用方法
     

3.使用注意点

  • 匿名对象只能使用一次

二、垃圾回收机制

当堆内存的对象没有变量指向时,会被回收

三、面向对象第二大特性:继承

1.继承解释

java中类和js的原型差不多。都是为了创建对象服务。使对象拥有各自的属性和方法,也 有相同的属性和方法。
子类继承后会拥有父类的成员方法和成员变量了。提高代码的复用性,让类与类直接产生了关系,作为多态的前提。
在java中指的是“一个类”可以“继承自”“另一个类”。 "被继承的类"叫做: 父类/超类/基类,"继承其他类的类"叫做:子类。继承后,“子类”中就“拥有”了“父类”中所有的成员(成员变量、成员方法)。 “子类就不需要再定义了”。

2.继承语法

extends关键字

public class 父类名{

}

public class 子类名 extends  父类名{
 //j继承语法
}

3.继承使用注意点

  • Java是单继承的,一个类只能继承一个直接父类,但是一个父类可以有多个子类。

四、继承后子类访问父类成员规则

  • 父类构造方法:有参构造方法子类不能继承,子类直接new会报错,无参构造方法也不会继承,不会报错是因为子类new时,系统会自动创建一个无参构造方法,所以子类引用super来调用父类的构造方法创建对象。
  • 私有成员:使用parvate修饰的成员,子类可以继承,但是无法访问,要区分继承和访问。
  • 非私有成员:可以继承和访问,当通过“子类”访问非私有成员时,先在子类中找,如果找到就使用子类的,找不到就继续去“父类”中找。即子类有这个非私有成员就使用子类的,没有就访问非私有父类的。要是子类的这个成员是私有的,父类是非私有的,不能访问,会报错。要是父类是私有的,子类是非私有的,可以方法,是访问的子类的。

五、一个类文件定义多个类

一个类文件里面只能有一个public类,该类的类名和文件名一致,还可以有其他类,但是其他类不能再写public。只能有一个public修饰的类,且该类的类名要和文件名一致。

六、方法重写

1.方法重写解释

子类和父类出现一模一样的方法时(返回值类型,方法名和参数列表都相同时),会出现覆盖效果,也称为重写或者复写,要区分方法重载。
方法重载是在一个类中,不是父子类,而且只有参数个数不同时,才会出现。

2.重写写法

//父类
class Fu{
    public void method(){
        System.out.println("Fu method");
    }
}
//子类
class Zi extends Fu{
     //重写method方法
    @Override
    public void method() {
        System.out.println("Zi method");
    }

}

可以用@override注解标识,如果不是重写的方法标识,就会报错。
权限修饰符可以不一样,子类重写父类的方法的访问权限不能低于父类的访问权限,一般都是相同的。
public - protected - 默认 - private

super.方法()
会在重写方法里调用父类的要重写的方法,保留了父类的方法功能。

3.重写注意点

  • 权限修饰符可以不一样,子类重写父类的方法的访问权限不能低于父类的访问权限,一般都是相同的,public - protected - 默认(不写) - private。
  • 一定要是父子类关系。
  • 子类中重写的方法返回值类型,方法名,参数列表一定要和父类一模一样。
  • 子类中重写的方法可以使用@Override注解进行标识,如果不是重写的方法使用@Override注解标识就会报错。
  • 当父类的方法不能满足子类的时候,就需要重写了。

七、this关键字

1.this解释

this存储“当前对象的引用”
this可以方法本类的成员属性、成员方法和构造方法

2.写法

public class Student{
    String name = "张三";
     public Student(){
        System.out.println("空参构造方法...");
    }
      public Student(String name) {
        this();
        //调用另一个构造方法即上面的空参构造方法
        //当使用this()调用另一个构造方法时,此代码必须是此构造方法的第一句有效代码。这个this()必须放在第一行
        //在使用this访问本类的构造方法时,只能在本类的构造方法使用
        //本类构造方法之间不能同时相互调用,即在无参构造方法里调用有参,有参里调用无参,会进行死循环。所以不能相互调用
        //this(参数)是访问有参的构造方法
        System.out.println("有参构造方法...");
    }
    public void show(){
        System.out.println("name = " + this.name);// 张三,访问本类的成员属性
         this.eat();//访问本类的成员方法,在本类中调用其实可以省略this
    }
    public void eat(){
        System.out.println("eat方法...");
    }
}

3.this使用注意点

  • this可以访问本类的成员变量: this.成员变量 一般用来区分同名的成员变量和局部变量
  • this可以访问本类的成员访问: this.成员方法名(实参);
  • this可以访问本类的构造方法:
  • 空参构造: this();
  • 有参构造: this(实参);
    注意:
    1.只能在本类的构造方法中使用this调用其他构造方法
    2.在本类的构造方法中使用this调用其他构造方法,必须放在该构造方法的第一行,否则会报错
    3.两个构造方法不能使用this同时相互调用

八、super关键字

1.super解释

super存储“父类对象”的引用
super可以访问父类的成员属性、成员方法和构造方法。
super一定是在子类中。
super是表示父类,可以看作是父类的当前对象

2.super写法

class Fu{
    int num = 100;
   //父类成员方法
     public void method1(){
        System.out.println("Fu method1...");
          public Fu(){   //父类构方法
        System.out.println("Fu 类的空参构造方法..");
    }
    public Fu(String name, int age) {
  
        System.out.println("Fu 类的有参构造方法..");
    }
    }
}

class Zi extends Fu{
    int num = 10;
    //子类构造方法
      public Zi(){
        super();// 调用父类的空参构造方法,必须放在第一行,这样可以使用父类的构造方法来创建有参的子类对象。
        //要区分好继承和访问,继承的不一定能访问,能访问的一定继承了。
        System.out.println("Zi 类的空参构造方法..");
    }
    public Zi(String name,int age){
        super(name,age);// 调用父类的有参构造方法,必须放在第一行,这样new Zi时也能给子类对象赋值。
         System.out.println("Zi 类的有参构造方法..");
    }
 @Override
    public void method1(){ //重写的同时还可以调用父类的方法
        super.method1();// 调用父类的method1方法
        System.out.println("Zi method1...");
    }
    public void show(){
        int num = 1;
        System.out.println("局部变量num:"+num);// 1
        System.out.println("Zi 类中的num:"+this.num);// 10
        System.out.println("Fu 类中的num:"+super.num);// 100

      }
}

3.super使用注意点

  • super可以访问父类的成员变量: super.成员变量 一般用来区分父子类中同名的成员变量,要是没有就去爷爷类,所有类的父类都继承object类。
  • super可以访问父类的成员方法: super.成员方法(实参); 一般用来在子类中访问父类的成员方法
  • super可以访问父类的构造方法:
  • 空参构造: super();
  • 有参构造: super(实参);
    注意:
    1.子类的构造方法默认会调用父类的空参构造方法
    2.super访问父类的构造方法,可以用来初始化从父类继承过来的属性
    3.在子类的构造方法中,使用super调用父类的构造方法,必须放在子类构造方法的第一行

九、继承特点

  • java只支持单继承,只能有一个父类,不可以有多个父类,但是一个父类可以有多个子类。
  • 可以多层继承

十、抽象类

1.抽象类解释

使用abstract关键字修饰的类就是抽象类,它不能创建对象,只能给子类继承,一般抽象类都是用来做为父类。

2.写法

修饰符 abstract class 类名{
    
}

3.抽象方法

1.抽象方法解释

没有方法体,使用abstract修饰的方法就是抽象方法,抽象方法一般都是作为方法模板,给子类继承后重写使用,因为子类肯有不同的实现,父类有抽象方法后,子类必须重写。

2.写法

//修饰符 abstract 返回值类型 方法名(形参列表);
	public abstract void work();//抽象方法没有方法体

4.使用抽象类的注意点

  • 抽象类不能被创建对象,就是用来做“父类”,被子类继承的。
  • 抽象类不能被创建对象,但可以有“构造方法”——为成员变量初始化。
  • 抽象类中可以没有抽象方法,但抽象方法必须定义在抽象类中
  • 子类继承抽象类后,必须重写抽象类中所有的抽象方法,否则子类必须也是一个抽象类

十一、模板设计模式

1.设计模式解释

设计模式就是解决问题的固定思路,也就是代码设计思路经验。

2.抽象模板设计模式

抽象类体系的就是模板设计思想,
抽象方法作为填充模板,各个子类重写填充模板。抽象类中再定一个主方法,调用抽象方法,这样子类调用这个方法时,会自动调用子类重写的抽象方法,实现不同的功能。

3.设计模式实现步骤

  • 定义抽象父类作为模板
  • 在父类中定义"模板方法"— 实现方法(通用模板)+抽象方法(填充模板)
  • 子类继承父类,重写抽象方法(填充父类的模板)

十二、fianl关键字

1.final解释

被final修饰后不可变,可以修饰类,方法和变量。

2.final写法

//权限修饰符 final class 类名 {}
  

//例如:
public final class FinalClassFu {
  // final修饰基本数据类型
        final int NUM = 10;
        // NUM = 20;// 编译报错,final修饰的变量只能赋值一次,不能重复赋值
 public final void show(){

    }
}
public class FinalClassZi /*extends FinalClassFu*/ {
    // FinalClassFu类被final修饰了,所以不能被继承,下面的代码假装已继承
    
    /*@Override
    public void show() {

    }*/
    // 无法重写父类中的show方法,因为父类中的show方法被final修饰了
}

3.fianl的使用注意点

  • 被final修饰的类不可以被继承。
  • 被修饰的方法不可以重写,
  • 被修饰的变量只能赋值一次。
  • 一般都是定义的时候赋好值,也可以通过构造方法赋值一次。
  • 被final修饰的常量名称,一般都有书写规范,所有字母都大写

十三、statci关键字

1.static关键字解释

static是一个静态修饰符关键字,表示静态的意思,可以修饰成员变量和成员方法以及代码块,不能修饰局部变量。
当 static修饰成员变量时,该变量称为类变量。该类的每个对象都共享同一个类变量的值。任何对象都可以更改该类变量的值,但也可以在不创建该类的对象的情况下对类变量进行操作。没有被static修饰的成员变量是每个对象独有的,每个对象修改都不影响其他对象的这个值,statci修饰的成员变量,相当于一个公关的变量,给所有对象使用。

2.static用法

public class Person {
 // 非静态变量
    String name;// 姓名
    // 静态变量
    static String country;// 国籍
     public Person() {
    }
    public Person(String name, String country) {
        this.name = name;
        this.country = country;
    }
    // 非静态方法
    public void method1(){
        System.out.println("Person method1...");
    }

    // 静态方法
    public static void method2(){
    //静态方法中不能直接访问非静态成员变量和非静态成员方法
        //System.out.println("非静态的成员变量:"+name);// 编译报错
          //method1();// 编译报错
           //静态方法中只能直接访问静态成员变量和静态成员方法
        System.out.println("静态成员变量:"+country);
        method4();
        //报错,静态方法不能出现this
       // this.method4();
        System.out.println("Person method2...");
    }
    //静态方法
    public static void method4(){
        System.out.println("静态 method4方法");
    }
}

3.static使用注意点

  • 静态修饰符关键字,可以修改成员变量和成员方法和代码块
  • 被修饰的变量变成公共的了。每个对象都能使用,且每个对象都能修改,会影响其他对象。这个成员变量是属于类的。一般叫静态成员变量/类变量。
  • 访问一般是类名.静态成员变量。也能通过对象访问,但是 不推荐。
  • 静态方法也是类名.方法名(),也能通过对象,但是不推荐。
  • 静态方法不能直接访问非静态方法,在类里面创建的方法一定要注意是否是静态方法。
  • 静态方法里不能出现this关键字。
  • 一般static是使用开发一些工具类,通过类名直接调用方法来实现某种功能,不用创建对象,十分的方便。
  • 静态方法中只能直接访问静态成员变量和静态成员方法
  • 非静态方法中可以直接访问一切成员变量和成员方法,既可以访问静态和非静态的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值