继承:实现代码的复用
1. 子类继承了父类中所有属性和方法(相当于在子类中定义了),父类中非私有的属性和方法在子类中能直接访问;但父类中私有的属性和方法不能在子类中直接访问,要通过父类提供的公共方法去访问。
2. 在实例化子类的对象时,会调用子类的构造器,子类构造器中默认有一个super(),这会调用到父类的构造器
3. 如果想要调用父类中指定的构造器,在子类构造器中显示的调用一下super(参数列表)
4. super在使用时,要放在子类构造器的第一行(super只能在构造器中使用)
5. super()和this()都只能放在构造器的第一行,所以这两个方法不能在一个构造器中共存。
super()是子类去调用父类中的构造器;this()是子类去调用子类中的构造器
6. Object是所有类的父类
7. 当在实例化一个子类对象时,构造器的调用会一直追溯到Object
9. 子类最多只能继承一个父类,即java是单继承机制
继承的内存布局:
子类继承父类的属性和方法,也可以覆写父类的属性和方法。
class Person { private int age; public void setAge(int age) { if (age < 0 || age > 200) age = 0; else { this.age = age; } } public int getAge() { return age; } public void printInfo() { System.out.println("age = "+age); } public Person () {
System.out.println("Person ()");
}
public Person (int age) { System.out.println("Person (int age)"); this.age = age; } } class Student extends Person{ private String school; public void setSchool(String school) { this.school = school; } public String getSchool() { return school; } public Student(String school) { /* will call the super() */ //super();//如果子类调用父类中默认的构造方法,super()写不写都行 super(5); //如果子类调用父类中带参数的构造方法,super就必须写,且还要带参数 System.out.println("Student(String school)"); this.school = school; } /* override */ public void printInfo() {//方法的重写 System.out.println("school = "+school+"; age = "+getAge()); } } public class Ext4 { public static void main (String args[]) { Student stu = new Student("ustc"); //stu.setAge(10); System.out.println(stu.getAge()); System.out.println(stu.getSchool()); stu.printInfo();//子类中有实现printInfo方法,就调用子类中的方法;如果没有实现,将会调用父类中的方法 } }
super关键字:
1. 子类的构造方法里会默认调用super()
2. 可以在子类构造方法中首行自行调用super(),可加参数
3. super表示父类,可以用super.xxxx调用父类方法
4. 当子类的属性和方法跟父类的属性和方法重名时,为了访问父类的成员,必须通过supuer。如super.方法名()、super.属性名
当子类的属性和方法跟父类的属性和方法没重名时,使用super、this、直接访问方法或属性的效果是一样的。
如在子类的一个方法中调用和父类中同名的方法cal(属性也类似):
如在子类的一个方法中调用和父类中同名的属性:
final关键字:final可以修饰类、属性、方法、局部变量
1. 当不希望某个类被继承时,可以用final修饰这个类
2. 当父类中的某个方法不希望被子类重写,可以用final修饰这个方法
3. 当不希望类的某个属性值被修改,可以用final修饰这个属性
4. 当不希望某个局部变量被修改,可以使用final修饰这个局部变量
方法的重写:
1. 子类中重写方法的形参列表、方法名要和父类中方法的形参列表、方法名完全一样
2. 子类中重写方法的返回类型和父类方法返回类型一样,或者是父类返回类型的子类
如:父类方法的返回类型是Object,子类中重写方法的返回类型可以是String类型
3. 子类中重写的方法不能缩小父类方法的访问类型
class Father { private int money;//父类中的私有属性不能被子类访问 public int getMoney() {return money; } public void setMoney(int money) {this.money = money; } public void printInfo() {System.out.println("This is Father");} private void printInfo2() {System.out.println("This is Father");}//父类中的私有方法不能被子类访问 } class Son extends Father{ private void printInfo() {System.out.println("This is son");}//会出错,编译不过,因为3.子类覆写的方法不能缩小父类方法的权限 public void printInfo2() {System.out.println("This is Father");}//printInfo2不是对父类中printInfo2方法的复写,
//因为父类中的方法是私有的,子类都不知道有这个方法,这个是子类自己实现的方法 } public class Ext5 { public static void main (String args[]) { Son son = new Son(); son.setMoney(100);//由于money是父类中私有的属性,所以不能用son.money=100,即1.父类中的私有属性不能被子类访问 //son.printInfo(); } }
抽象类:规定子类必须实现的方法,起“模板”作用
格式:
abstract class 类名 { 属性; 普通方法 { } // 抽象方法 访问权限 abstract 返回值类型 方法名 (参数) ; /* 只需要声明,不需要实现 */ }
1. 抽象类不能实例化对象
2. 子类必须重写全部抽象方法(子类要实现全部的抽象方法),除非它自己也申明为一个抽象类
3. 抽象类可以不包含抽象方法,当包含抽象方法的类一定是抽象类
4. abstract只能修饰类和方法,不能修饰属性和其他的。
5. 抽象方法不能使用private、final、static来修饰,因为这些关键字都和重写相违背
abstract class Father {//抽象类 private int money; public int getMoney() {return money; } public void setMoney(int money) {this.money = money; } public abstract void study();//抽象方法 } class Son extends Father{ public void study() {System.out.println("I am study"); }//2. 子类要实现全部的抽象方法 } public class Ext6 { public static void main (String args[]) { //Father f = new Father();//1. 抽象类不能被实例化对象,会编译出错 Son son = new Son(); son.study(); } }
接口:跟抽象类相似,起“模板”作用;子类可以实现(implement)多个接口,突破“单继承”的限制
格式:
// 接口由全局常量、公共的抽象方法组成 interface 接口名称 { //属性; //方法(1.抽象方法 2.默认方法[default 修饰] 3.静态方法);默认方法和静态方法是jdk8引入的,可以有方法体({})。抽象方法没有方法体{}. } 如:interface A { public static final int i = 10; public abstract int getNumber( ); }
1. 子类必须重写全部抽象方法(子类要实现全部的抽象方法)
2. 接口中的所有方法都是public的,可以省略不写;
3. 接口中的抽象方法可以不用abstract修饰,可以省略不写
4. 抽象类实现接口,可以不用实现接口的方法
5. 一个类可以实现多个接口
6. 接口中的属性只能是final,而且是public static final修饰,在接口中定义一个int a = 10;前面省略了public static final
7. 接口中属性的访问形式:接口名.属性名
8. 一个接口不能继承其他类,但是可以继承多个别的接口
9. 接口的修饰符只能是public和默认的。(和public calss在一个文件的接口是默认的,不和public class在一个文件的接口是public的)
abstract class Father { private int money; public int getMoney() {return money; } public void setMoney(int money) {this.money = money; } public abstract void study(); } interface A { public static final int i = 10;//将public static final删除,其还是等效于有public static final,且i不能被修改(i是全局常量) public abstract int getNum();//将public abstract删除,其也等效于有public abstract } interface B { public static String name = "InterfaceB"; public abstract String getName(); } class Son extends Father implements A,B{//子类不仅可以继承父类(只能继承一个父类),还可以实现多个接口 public int getNum() {return i;}//子类必须覆写全部抽象方法(子类要实现全部的抽象方法),在{}中写i++;会编译出错,因为i是全局常量 public String getName() {return name;} public void study() {System.out.println("I am study"); } } public class Ext7 { public static void main (String args[]) { Son son = new Son(); System.out.println(son.getName()); son.study(); } }
今天的文章java之继承_java继承的概念分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/48608.html