参考教程 JDK8帮助文档
狂神说Java视频
封装 程序设计要求:高内聚,低耦合
高内聚:类的内部数据操作细节自己完成,不允许外部干涉
低耦合:尽量暴露少量的方法给外部使用
封装 (数据的隐藏):通常应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏。
REMEMBER:属性私有,get/set
关键字:private
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 public class Student { private String name; private int id; private char sex; private int age; public String getName () { return this .name; } public void setName (String name) { this .name = name; } public int getAge () { return age; } public void setAge (int age) { if (age > 120 || age < 0 ){ this .age = 3 ; }else { this .age = age; } } }
main方法测试:
1 2 3 4 5 6 7 8 9 10 11 12 public class Application { public static void main (String[] args) { Student s1 = new Student(); s1.setName("Messi" ); System.out.println(s1.getName()); s1.setAge(999 ); System.out.println(s1.getAge()); } }
IDEA生成get&set方法快捷键 :Alt+insert,选择Getter&Setter,再选择需要生成get&set方法的属性名称。
封装的意义 :
提高程序安全性,保护数据。
隐藏代码的实现细节
统一接口
提高系统可维护性
继承 继承的本质:对某一批类的抽象,从而实现对现实世界更好的建模。
关键字:extends
Java中类只有单继承,没有多继承。 即一个子类只能有一个父类(只能直接继承一个类),一个父类可以有多个子类。
继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。
继承关系的两个个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends
来表示。
子类和父类之间,从意义上讲应该具有“is a”的关系。
1 2 3 4 5 6 7 8 9 10 11 12 13 public class Human { public int money = 10_0000_0000 ; public void say () { System.out.println("说话" ); } } public class Classmate extends Human {}
main测试:
1 2 3 4 5 6 7 public class Application { public static void main (String[] args) { Classmate classmate = new Classmate(); classmate.say(); System.out.println(classmate.money); } }
若一个类有final
修饰符则不能被继承,final
属于断子绝孙修饰符。
Object类 在Java中所有的类都默认直接或间接继承Object类
IDEA打开继承树快捷键:Ctrl+H
super 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 public class Human { protected String name = "Person" ; public void say () { System.out.println("Hello" ); } public Human () { System.out.println("父类Human构造无参执行了" ); } } public class Player extends Human { private String name = "Player" ; public void test1 (String name) { System.out.println(name); System.out.println(this .name); System.out.println(super .name); } public void say () { System.out.println("Shoot" ); } public void test2 () { say(); this .say(); super .say(); } public Player () { System.out.println("子类Player构造无参执行了" ); } }
main测试:
1 2 3 4 5 6 7 8 9 public class Application { public static void main (String[] args) { Player player = new Player(); player.test1("Messi" ); player.test2(); } }
super
注意点:
super
调用父类的构造方法,必须在构造方法的第一个
super
必须只能出现在子类的方法或者构造方法中
super
和this
不能同时调用构造方法
super
VSthis
:
代表的对象不同:
this
:本身调用者的这个对象
super
:代表父类对象的引用
前提不同:
this
:没有继承也可以使用
super
:只能在继承条件下才可以使用
构造方法不同:
this()
:本类的构造器
super()
:父类的构造器
方法重写 重写都是方法,和属性无关
1 2 3 4 5 6 7 8 9 10 11 public class B { public static void test () { System.out.println("B->test()" ); } } public class A extends B { public static void test () { System.out.println("A->test()" ); } }
main测试:
1 2 3 4 5 6 7 8 9 10 11 public class Application { public static void main (String[] args) { A a = new A(); a.test(); B b = new A(); b.test(); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class B { public void test () { System.out.println("B->test()" ); } } public class A extends B { @Override public void test () { System.out.println("A->test()" ); } }
IDEA生成get&set方法快捷键 :Alt+insert,选择Override Method,或者直接Ctrl+O。
main测试:
1 2 3 4 5 6 7 8 9 10 public class Application { public static void main (String[] args) { A a = new A(); a.test(); B b = new A(); b.test(); } }
静态与非静态方法的区别:
只有普通的方法调用可以是多态的 。
重写总结:
前提:需要有继承关系,是面向一个方法来说的,子类重写父类的方法。
方法名必须相同
参数列表必须相同(不同则为重载 )
修饰符:范围可以扩大但不能缩小,public>protected>default>private
抛出的异常:范围可以被缩小但不能扩大,例如ClassNotFoundException<Exception
子类的方法和父类必须一致,方法体不同
重写的意义:
多态 多态:即同一方法可以根据发送对象的不同而采用多种不同的行为方式
核心思想:一个对象的实际类型是确定的,但可以指向对象的引用类型有很多
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class People { public void run () { System.out.println("People RUN" ); } } public class Worker extends People { @Override public void run () { System.out.println("Worker RUN" ); } public void eat () { System.out.println("Worker EAT" ); } }
main测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 public class Application { public static void main (String[] args) { Worker w1 = new Worker(); People w2 = new Worker(); Object w3 = new Worker(); w1.run(); w2.run(); ((Worker) w2).eat(); } }
多态注意事项:
多态是方法 的多态,属性没有多态
需要有父类和子类的继承关系,没有的话会报类型转换异常(ClassCastException)
存在条件:继承关系,方法被需要重写,父类引用指向子类对象:Father f1 = new Son()
无法重写的方法:static
(属于类不属于实例)、final
(常量)、private
instanceof
二元操作符,测试它左边的对象是否是它右边的类的实例,返回boolean的数据类型。
1 2 3 4 5 6 7 8 public class People {} public class Worker extends People {} public class Teacher extends People {}
main测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 public class Application { public static void main (String[] args) { Object o = new Worker(); System.out.println(o instanceof Object); System.out.println(o instanceof People); System.out.println(o instanceof Worker); System.out.println(o instanceof Teacher); System.out.println(o instanceof String); People p = new Worker(); System.out.println(p instanceof Object); System.out.println(p instanceof People); System.out.println(p instanceof Worker); System.out.println(p instanceof Teacher); Worker w = new Worker(); System.out.println(w instanceof Object); System.out.println(w instanceof People); System.out.println(w instanceof Worker); } }
System.out.println(X instanceof Y);
能否编译通过看左边 的引用类型X与Y有没有继承关系,实际判断结果看右边 的实际类型里X是不是Y的实例(子类或本类)。
OOP:编译看左,运行看右。
类型转换 父类:高,子类:低。从高到低需要强制转换。
1 2 3 4 5 6 7 8 9 10 11 public class People { public void run () { System.out.println("People RUN" ); } } public class Worker extends People { public void go () { System.out.println("Worker GO" ); } }
main测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public class Application { public static void main (String[] args) { People obj = new Worker(); ((Worker) obj).go(); Worker w = new Worker(); w.go(); People p = w; } }
类型转换总结:
存在条件:父类引用指向子类的对象
把子类 转换为父类 :向上转型,不用强制转换,丢失子类中可直接调用的独有 的方法
把父类 转换为子类 :向下转型,需要强制转换 ,丢失父类被子类重写 掉的方法。
意义:方便方法的调用,减少重复的代码,使代码更简洁。
Java学习笔记(七)——面向对象(封装、继承、多态)