Java面向对象学习 ------------ Day3
一、类与对象
-
类的创建
- 类是一个模板,是抽象的,需要实例化
- 类实例化后会返回一个自己的对象
java//举例学生类的创建 public class Student(){ //属性:字段 存在默认初始化 String name; int age; //方法 public void study(){ ... 方法体 } }
-
对象的创建
必须使用
new
关键字创造对象java//对象student Student stuent = new Student(); //student就是Student类的具体实例!
-
构造器
特征:和类名相同;没有返回值;
作用:
new
的本质是在调用构造方法;初始化对象的值(类似c++里的构造函数)注意点:定义了有参构造后没有了默认的无参构造,若要使用无参构造需要显式定义一个(AIt + insert)
java//Student无参构造 public Student(){ }
二、封装
-
定义
程序设计追求"高内聚,低耦合"。
封装是数据的隐藏,通常应禁止直接访问一个对象中数据的直接表示,而应通过操作接口来访问。
-
属性私有
类中的属性设置为私有
private
,需通过getter/setter(AIt + insert)来获取与设置,在类外部无法直接访问。
三、继承
-
定义
-
继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。
-
继承是类和类之间的一种关系,两个类,一个为父类(基类)一个为子类(派生类)。
-
子类继承父类,就会拥有父类的全部方法;用关键字extends来表示。
-
-
this / super
this
:本身调用者这个对象;没有继承也能使用super
:父类对象的应用;只有在继承条件才能使用
java//父类 public class Person { String name = "sang"; public void test(){ System.out.println(this.name);//结果为 sang } } //子类 public class Student extends Person{ private String name = "joker"; public void print(){ System.out.println(this.name);//结果为 joker System.out.println(super.name);//结果为 sang } }
-
方法重写
- 要求
- 方法名必须相同
- 参数列表列表必须相同
- 修饰符:范围可以扩大但不能缩小 :
public>Protected>Default>private
- 抛出的异常:范围,可以被缩小,但不能扩大;
classNotFoundException -->Exception(大)
- 静态方法与非静态方法重写区别:
- 静态方法其调用只和左边定义的数据类型有关,如
Student student = new Person()
- 非静态方法则为方法重写
- 实例:
java//父类 public class Person { public void test(){ System.out.println("sang"); } } //子类 public class Student extends Person{ //方法重写(AIt + insert) public void test() { System.out.println("joker"); } } //main public class Application { public static void main(String[] args) { Student student = new Student(); Person person = new Student(); person.test();//子类重写了父类的方法,执行子类的方法 joker } }
三、多态
-
定义
即同一方法可以根据发送对象的不同而采用多种不同的行为方式。
一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多(父类,有关系的类)。
-
条件
- 有继承关系
- 子类重写父类方法
- 父类引用指向子类对象
-
instanceof
看
System.out.println(X instanceof Y);
能否编译通过,若能通过代表X类与Y类有关系,若返回true
则存在包含关系,false
则不存在包含关系。 -
几种代码块
JAVApublic class Person{ //2:赋初值~(第二) { System.out.println("匿名代码块"); } //1:只执行一次~(最先执行) static{ System.out.println("静态代码块"); } //3:(最后) public Person(){ System.out.println("构造方法"); } public static void main(string[]args){ Person person1 new Person(); System.out.println("=============="); Person person2=new Person(); }
四、抽象类
-
目的与要求
- 提供基础实现,约束子类行为
- 其中可包含实例变量/静态变量/常量,具体方法 + 抽象方法(只有方法名字没有具体实现)
- 不能
new
抽象类,抽象方法必须在抽象类中、
-
典型结构
java//抽象类 abstract public abstract class Shape{ private String color; public Shape(String color) { this.color = color; } public abstract double area(); //抽象方法,后续子类必须实现 }
五、接口
-
定义与要求
- 定义行为契约,解耦实现
- 仅允许有
public static final
常量与抽象方法(jdk8及之后支持default
/static
方法) - 可多继承
-
典型结构
java//接口 interface public interface Drawable { // 传统抽象方法 void draw(); } //实现类 public class Circle implements Drawable { @Override public void draw() { // 必须重写冲突方法 System.out.println("draw");// 显式指定接口 } }