继承和重写

it2022-05-05  178

1.static:扩展修饰符。静态的,用来修饰成员变量和成员方法。 1.1:静态变量(静态属性):用static修饰的成员变量叫静态变量。 1.1.1:静态变量的生命周期:随着类的加载而创建,随着程序的终止,类的销毁而失效。 1.1.2:静态变量的作用域:静态变量属于类,类的所有对象共享这个静态变量。 1.1.3:静态变量的缺点:非常占内存。 1.1.4:静态变量的适用场景:当一个类的所有对象共享一个属性时,这个属性就可以定为 静态变量。 1.1.5:静态变量的声明和调用: 1.1.5.1:静态变量声明:public static 数据类型 变量名; 1.1.5.2:静态变量的调用: 在同一个类中:静态变量名; 在不同的类中:类名.静态变量名;(推荐) 对象名.静态变量名; 注意:成员变量属于对象,类的每个对象独有一份成员变量。 成员变量存在内存的堆中,静态变量存在内存的方法区的静态区中。 1.2:静态方法:用static修饰的方法都叫静态方法。 1.2.1:静态方法的语法:public static 返回值类型 方法名(形参列表){ 方法体; 【return 结果】 }

1.2.2:静态方法的特征: 1.2.2.1:静态方法属于类,类的所有对象共享。 1.2.2.2:实例方法中可以直接调用静态变量也可以直接调用非静态变量; 静态方法中可以直接调用静态变量,不可以直接调用非静态变量; 静态方法中如果想调用非静态变量,只能通过对象调用; 1.2.3.3:实例方法中可以直接调用静态方法也可以直接调用非静态方法; 静态方法中可以直接调用静态方法,不可以直接调用非静态的方法; 静态方法中如果想调用非静态的方法,只能通过对象调用; 1.2.3:静态方法的适用场景:当一个类为工具类,这个类的方法就可以声明为静态方法。 注意:普通成员方法又叫非静态方法又叫实例方法。 1.3:静态块:在类加载时执行,一生只执行一次。 1.3.1:静态块的语法:static{ }

1.3.2:静态块的特点:静态块中只能调用静态的变量和方法,不能调用非静态的变量和方 法。 1.3.3:静态块的适用场景:当类一加载时就要初始某些数据时就可以静态块。

eg:public class Student { /** * 静态属性 */ public static String school=""; /** * 姓名属性 */ public String sname; /** * 静态块 */ static { school="千锋"; //sname=""; show3(); //show2(); } public void show1() { System.out.println("这是实例方法"); System.out.println("静态变量:"+school+",成员变量:"+sname); show2(); show4(); } public void show2() { System.out.println("这是实例方法"); } public static void show3() { System.out.println("这是静态方法"); System.out.println("静态变量:"+school); //在自己的类中创建自己的对象,非常耗内存 Student stu=new Student(); System.out.println("成员变量:"+stu.sname); stu.show2(); show4(); } public static void show4() { System.out.println("这是静态方法"); }

}

public static void main(String[] args) { //用构造方法创建对象 Student stu1=new Student(); //用对象调用属性并赋值 stu1.sname="张三"; stu1.school="北大"; //用对象调用实例方法 stu1.show2(); //用对象调用静态方法 stu1.show4(); //用类名调用静态方法 Student.show4(); //用构造方法创建对象 Student stu2=new Student(); //用对象调用属性并赋值 stu2.sname="李四"; stu2.school="青华"; //用类名调用静态变量 System.out.println("学生姓名:"+stu1.sname+",所属的学校:"+Student.school); //用对象调用静态变量 System.out.println("学生姓名:"+stu2.sname+",所属的学校:"+stu2.school); }

2.继承:满足is-a关系。 2.1:继承的作用:提高代码的复用性。 2.2:继承的关键字:extends 2.3:被继承的类:父类,基类,超类,根类 继承的类:子类,衍生类 2.4:子类可以继承父类的公有属性和方法,不能继承父类私有的属性和方法,子类不能继承父 类的构造方法,但是子类可以调用父类的构造方法。 2.5:在创建子类对象时,如果我们没有调用父类构造方法,系统会默认先调用父类的无参构 造,再调用子类构造方法;如果子类构造方法中调用了父类的构造方法,系统就 不会默认调用,会先执行我们调用父类构造,再执行子类构造方法。 2.6:继承有特性 单根性:一个子类只能直接继承一个父类。 传递性:A类继承B类,B类继承C类,A类间接继承C类。 eg:public class Pet extends Animal{ /** * 昵称 */ public String nickName;

/** * 品种 */ public String breed; /** * 性别 */ public char sex; /** * 健康值 */ private int health; public Pet() { System.out.println("这是Pet类的无参构造方法"); } public Pet(String nickName, String breed, char sex) { System.out.println("这是pet类的有参构造方法"); this.nickName = nickName; this.breed = breed; this.sex = sex; } /** * 宠物叫声方法 */ public void wow() { System.out.println("宠物在叫"); } /** * 宠物在跑 */ private void run1() { System.out.println("宠物在跑"); }

}

/** * 狗类,继承宠物类 * @author sx * @version 1.0 2019年6月26日 */ public class Dog extends Pet{ public Dog() { super("aa","中华国园犬",'公');//子类调用父类的构造方法 System.out.println("这是dog类的无参构造方法"); } public Dog(String nickName, String breed, char sex) { System.out.println("这是dog类的有参构造方法"); this.nickName = nickName; this.breed = breed; this.sex = sex; } }

3.super:代表父类对象的引用。 3.1:调用父类属性:super.属性名; (省略super) 3.2:调用父类的方法:super.方法法(); (省略super) 3.3:调用父类的构造方法:super(参数列表);也只能写在构造方法的第一句

4.方法重写: 4.1:方法重写的作用:当子类继承了父类的方法后,父类的方法无法满足子类的需求,就可以 用方法重写。 4.2:方法重写的条件: 4.2.1:方法重写发生在继承关系的父子类中。 4.2.2:子类重写的方法的方法名和形参列表与父类被重写的方法的方法名和形参列表 一致。 4.2.3:子类重写的方法的返回值与父类被重写的方法的返回值相同或兼容。 兼容:两种数据类型相同或有父子关系。 4.2.4:子类重写的方法的访问修饰符与父类被重写的方法的访问修饰符相同或更大。 4.3:在子类重写的方法上可以@Override注解,作用:严格检查子类的方法是否是重写父类的 方法。

eg:/** * 宠物类 * @author sx * @version 1.0 2019年6月26日 */ public class Pet{ /** * 昵称 */ public String nickName; /** * 品种 */ public String breed; /** * 性别 */ public char sex; /** * 宠物叫声方法 */ public void wow() { System.out.println("宠物在叫"); } } /** * 狗类,继承宠物类 * @author sx * @version 1.0 2019年6月26日 */ public class Dog extends Pet{ /** *狗类重写父类的叫声方法 */ @Override public void wow() { System.out.println("狗在旺旺旺的叫"); } }

5.方法重载 VS 方法重写 5.1:作用不同:方法重载用来解决在同一个类中功能相同的方法的命名和调用问题; 方法重写用来解决当子类继承了父类的方法后,父类的方法无法满足子类的需 求,就可以用方法重写。 5.2:满足的条件不同:方法重载是在同一个类,方法名相同,参数列表不同; 方法重写是在有继承关系的父子类中,方法名和参数列表相同,返回值 类型相同或兼容,访问修饰符相同或更大。 5.3:检查不同:方法重载只能自己检查;方法重写可以用@Override注解来自动检查。 5.4:使用环境不同:方法重载发生一个类;方法重写至少发生两个类中

6.Object类:是所有Java类的基类,所有的Java类都直接或间接继承Object类。 6.1:hashCode():根据对象生成一个hash码,每个对象都可以获得一个hash码,不同对象的 hash码值是不同。 6.2:== 和equals() 6.2.1:==:==左右两边是基本数据类型的变量,==比较的是两个变量的值; ==左右两边是引用数据类型的变量,比较的是两个变量的内存地址是否相同。 6.2.2:equals():如果当前的类是从Object类中继承的equals()方法,当前类的两个对象调 用equals()比较时,equals()作用与相同。 如果当前的类重写equals()方法,当前类的两个对象调用equals(),比的是 两个对象的值 注意:String类底层重写了equals()方法,所以String类的对象调用equals(), 比的是两个字符串的值。

eg:public static void main(String[] args) { int num1=11; int num2=11; Student stu1=new Student(); stu1.sname="aa"; stu1.sage=18; Student stu2=new Student(); stu2.sname="aa"; stu2.sage=18; //==左右两边是基本数据类型,比变量的值 System.out.println(num1==num2);//true //==左右两边是引用数据类型,比变量的内存地址 System.out.println(stu1==stu2);//false //student类中继承了equals()直接使用,与==的作用相同 //student类中重写equals(),比的是值 System.out.println(stu1.equals(stu2));//false,true }

7.Final:最终的,扩展修饰符 7.1:最终类(断子绝孙类):用final修饰的类叫最终类。最终类不能被继承。

eg:public final class Pet{ }

7.2: 最终方法:用final修饰的方法都叫最终方法。最终方法不能被重写。

eg:public final void wow() { System.out.println("宠物在叫"); }

7.3: 常量:用final修饰的变量都叫常量。常量一生只赋一次值。 成员常量:在类中声明的常量。可以在声明的同时赋值,也可以在构造方法中赋值。 局部常量:在方法声明的常量。在声明的同时赋值,也可以先声明再赋值。

8.包:帮我们管理类,避免了类名重名的问题。 包名的命名规范:域名.公司/组织名.项目名.架构名 eg:com.qf.day8.demo1 包名全小写,且不能包含特殊符号。 声明包:package 包名; 导包:import 包名;

9.访问修饰符:


最新回复(0)