1.基本概念与注意事项
继承
1.继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
基本格式:
class Person{ // ....成员变量,构造方法 } class Student extends Person{ //....类体,调用 }
2.注意:
子类不能选择性继承父类;
Java不支持多重继承,但一个类可以实现多个接口,从而克服单继承的缺点;
构造方法不会被子类继承,但可以从子类中调用父类的构造方法。
3.子类继承其父类的所有public和protected成员,但不能继承其父类的private成员。那么如何在子类中访问到父类中的字段呢,我们可以在父类中提供用来访问其私有字段的public或protected方法,子类使用这些方法来访问相应的字段。
4.子类重写了父类中的某一个方法,隐藏父类中的字段,假如想在子类中访问到父类中被重写的方法和隐藏父类的字段,可以在子类中通过使用关键字super来调用父类中被重写的方法和访问父类中被隐藏的字段。
5.子类不继承其父类的构造方法。
当使用无参数的super()时,父类的无参数构造方法就会被调用;
当使用带有参数的super()方法时,父类的有参数构造方法就会被调用。
6.注意
如果要初始化父类中的字段,可以在子类的构造方法中通过关键字super调用父类的构造方法;
对父类的构造放的调用必须放在子类构造方法的第一行;
如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器;
如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表;
子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。
接口
1.接口可以理解为一种特殊的类,里面全部是由全局常量和公共的抽象方法所组成。我们可以直接把接口理解为100%的抽象类,既接口中的方法必须全部是抽象方法。
2.一个类可以实现不止一个接口。
3.一个接口可以继承另一个接口,或者另一些接口,接口也可以继承,并且可以多继承。
4.一个类如果要实现某个接口的话,那么它必须要实现这个接口中的所有方法。
5.接口中所有的方法都是抽象的和public的,所有的属性都是public,static,final的。
6.接口用来弥补类无法实现多继承的局限。
2.代码演示
1.银行存取钱
import java.util.Scanner; class Bank{ private int money; public Bank(int money){ super(); this.money=money; } public void setMoney(int money) { this. money=money; } public double getMoney() { return money; } public int save(int jia){ return money=money+jia; } public int out(int jian){ return money-=jian; } public void yue(int money3){ money=money3; } } public class java17 { public static void main(String[] args) { Bank bank=new Bank(10000); Scanner m=new Scanner(System.in); int s= m.nextInt(); bank.save(s); System.out.println("您存储" +s+"元"+"余额为:"+ bank.getMoney()); Scanner n=new Scanner(System.in); int o= m.nextInt(); bank.out(o); System.out.println("您取走" +s+"元"+"余额为:"+ bank.getMoney()); } }
2.面向对象综合性习题
18.定义一个学生类 Student,它继承自 Person 类。
(1)Person类:
成员变量(私有的):
姓名(name),字符串类型(String);
性别(sex),字符型(char);
年龄(age),整型(int)。
成员方法:
构造方法:对所有成员变量初始化
重写Object类的toString方法,返回字符串形如:姓名,性别,年龄
重写Object类的equals方法,当且仅当两人的姓名相等且性别相等且年龄相等时,认为两人相等。
(2)Student 类:
新增加的成员变量:
学号(number),长整型;
三门功课的成绩:哲学(phi),整型;
英语 (eng),整型;
计算机(comp),整型。
新增加的方法:
求三门功课的平均成绩 public double aver():该方法没有参数,返 回值类型为 double 型;
求三门功课成绩的最高分 public int max():该方法没有参数,返回值为 int 型;
求三门功课成绩的最低分 public int min():该方法没有参数,返回值为 int 型。
覆盖父类的同名方法:public String toString():获取学号、姓名、性别、平均分、最高分、最低分信息。
覆盖父类的同名方法equals:除了姓名、性别和年龄相等以外,学号也相等时,认为两学生相等。
(3)编写测试程序。程序要求实现:在程序中设置若干个学生信息(学号、姓名、性别、年龄、各科分数),要求通过运行程序,在屏幕中输出如下的结果:例如:学号:310 姓名:xpc 性别:n 年龄:19 平均分110 最高分:122 分 最低分:99。 试着比较两名学生是否相等。
class Per1{ public String name; public int age; public String sex; public void setName(String name) { this.name = name; } public String getName() { return name; } public void setAge(int age) { this.age = age; } public int getAge() { return age; } public void setSex(String sex) { this.sex = sex; } public String getSex() { return sex; } public Per1(){ } public Per1(String name,int age,String sex) { this.age = age; this.sex = sex; this.name = name; } public String toString(){ return name+age+sex; } public boolean equals(String name1,String name2,int age1,int age2){ if (name1.equals(name2)&&age1==age2){ return true; }else { return false; } } } class Student1 extends Per1{ int phi,eng,comp; public Student1(String name, int age, String sex,int phi,int eng,int comp) { super(name, age, sex); this.phi=phi; this.eng=eng; this.comp=comp; long number = 310; }public double aver(){ System.out.println((phi+eng+comp)/3); return (phi+eng+comp)/3; } public int max(){ int max=phi; if (eng>max){ max=eng; }else if(comp>max){ max=comp; }else { max=phi; } System.out.println(max); return max ; } public int min(){ int min=phi; if (eng<min){ min=eng; }else if(comp<min){ min=comp; }else{ min=phi; } System.out.println(min); return min; } public String toString(){ return "["+name+age+sex+max()+aver()+min()+"]"; } boolean equals(long number1,long number2){ if (number1 == number2) { return true; }else{ return false; } } } public class Java18 { public static void main(String[] args) { Per1 c1=new Per1("xpc",19,"m"); Per1 c2=new Per1("x",19,"n"); Student1 a1=new Student1("pc",18,"m",110,122,99); boolean equals=c1.equals(c1.name,c2.name,c1.age,c2.age); if(equals){ System.out.println("两个人相同"); }else{ System.out.println("两个人不相同"); } System.out.println(c1); System.out.println(c2); System.out.println(a1); } }
3.接口练习例题
//.按如下要求编写Java程序: // (1)定义接口A,里面包含值为3.14的常量PI和抽象方法double area()。 // (2)定义接口B,里面包含抽象方法void setColor(String c)。 // (3)定义接口C,该接口继承了接口A和B,里面包含抽象方法void volume()。 // (4)定义圆柱体类Cylinder实现接口C,该类中包含三个成员变量:底圆半径radius、 // 圆柱体的高height、颜色color。 // (5)创建主类来测试类Cylinder。 interface A{ double pi=3.14; void doubleArea(); } interface B{ void setColor(String c); } interface c extends A,B { void doublevolume(); } abstract class tem implements c{ public void doubleArea(){}; public void setColor(String c){}; public void doublevolume(){}; } class Cylinder extends tem{ private int radius; private int height; private String color; public double area(){ return pi*radius*radius; } public double volume(){ return area()*height; } public String color(){ return color; } } public class lianxijiekou { public static void main(String[] args) { Cylinder h=new Cylinder(); h.area(); } }
4.接口加运算
interface Icompute{ int com(int n,int m); } class Usecompute{ private int n; private int m; public void use(Icompute com,int one,int two){ this.n=n; this.m=m; com.com(n,m); } } class Add implements Icompute{ private int n; private int m; private int ret; public int com(int n, int m) { this.n=n; this.m=m; this.ret=n+m; System.out.println("ret="+ret); return ret; } } public class java25 { public static void main(String[] args) { Icompute n=new Add(); n.com(4,8); } }
3.学习反思
考核还是不理想,一道大题也运算不出来,算法题也没有回顾,整天忙得这么狠,但是结果还是不理想,找好自身问题,对自己询问:
知道某一代码的来龙去脉!
为什么这么写?
从哪来的每一步?
什么错误?
原因:全面、深刻的探寻
产生什么结果?
如何解决?
问题:
不是“没听懂”,而是“记不住”【要能说出来,讲清楚】
不能知其然,而不知其所以然【合理性】
只懂表象,不懂内核【原理性】