//类的格式声明 //格式 [修饰符] class 类名{ //属性列表 //构造器列表 //get/set方法 //其他方法 }
如何创建对象
new 类名(); 用无参构造
new 类名(参数); 用有参构造
匿名对象和有名对象:
Student stu = new Student(): stu对象名,也可以称为对象的引用
匿名对象: System.out.println(new Student());
对象内存图:
面向对象基本特征
封装
封装的作用:安全 使用方便 对使用者屏蔽实现细节
概念:
狭义:
属性的封装
(1)属性私有化:private
(2)提供公共get/set方法
广义:方法 类 包 组件 系统
继承
什么情况下需要继承?继承的好处是什么?
为了代码重用
(1)当有一个父类,如果再声明类时,发现这些类与已经存在的父类有很多相同特征,那么就可以通过继承的方式来简化代码
(2)已经很多类,发现这些类有很多共同的特点,那么我们可以把这些共同的特点抽取到一个父类中,以便简化代码
逻辑角度
表示is-a的关系
如何继承
语法格式: [修饰符] class 子类名 extends 父类名{ }
继承后对几个成员的影响
属性
(1)子类继承父类时,一定会继承父类的所有的属性,包括私有的,但是由于私有的关键字private的原因,在子类中无法直接操作它,但是可以通过get/set方式操作它
(2)当子类的属性与父类的属性重名时,而且父类的属性没有私有化,如果要访问父类的属性那么通过super.属性进行访问,如果子类中没有通过super.属性访问,那这个属性就表示是子类自己的
//面试题 package com.atguigu.review; public class Test { public static void main(String[] args) { Student stu = new Student(); System.out.println(stu.getInfo());//结果? 年龄:10 System.out.println(stu.getAge());//结果?20 如果子类重写,答案是10 } } class Person{ int age = 20; public int getAge() { return age; } public void setAge(int age) { this.age = age; } } class Student extends Person{ int age = 10; /*public int getAge(){ return age; }*/ public String getInfo(){ return "年龄:" + age; } }
方法
(1)子类继承父类时,一定会继承父类的所有的方法,包括私有的,但是由于private,在子类中无法直接操作,但是可以间接操作
(2)当父类的方法实现不适用于子类时,子类可以对父类的方法的进行重写
构造器
(1)子类继承父类时,不会继承父类的构造器
(2)子类继承父类时,一定会调用父类的构造器
如果父类有无参构造,那么子类会默认去调用父类的无参构造
如果父类没有无参构造,只有有参构造,那么子类必须在子类构造器中手动调用父类的有参构造
调用父类的无参构造的语句:super();
调用父类的有参构造的语句:super(实参列表);
而且这两个语句必须在子类的构造器的首行。
继承的原则:
(1)单继承
在Java中只支持单继承,也就是说一个类只能有一个直接父类 --》一个唯一的亲生父亲
(2)多层继承
在Java中父类还可以有父类,而且在子类中会继承父类以及父类的父类的所有的属性与方法 --》代代相传
子类对象在寻找一个方法、属性时,如果本类中找不到,会去直接父类中查找,如果直接父类中也找不到,在往上找,找到为止,一直追溯到java.lang.Object根父类中
通过super.属性和方法时,先从直接父类中查找,如果没有,再往上找,直到找到为止,一直可以到java.lang.Object
(3)一个类可以有很多个子类,子类还可以有子类
子孙满堂 开枝散叶
多态
多态的表现形式
(1)方法的重载:同一个类中,功能多种实现形式
方法的重写:父子类中,功能的不同实现形式
(2)对象的多态性
编译时类型与运行时的类型不一致,编译时看“左边”,运行时看“右边”,
编译时从“父类”中寻找方法,运行时执行的是“子类”重写过的代码
对象的多态性的前提:
(1)继承
(2)方法的重写
(3)多态引用
多态引用
Person p = new Student();
本态引用
Person p = new Person();
Student s = new Student();
多态的应用: (1)多态参数 (2)多态数组
类型转换:
向上转型
子类的对象赋值给父类的变量 自动完成
向下转型
把父类的变量赋值给子类的变量
强制类型转换
想要向下转型成功 父类的变量本身指向的就是该子类的对象
如何避免ClassCastException
//在向下转型之前,加判断 if(变量 instanceof 子类类型){ 子类类型 temp = (子类类型)变量; }
什么情况下需要向下转型
因为一个对一旦向上转型后,那么就无法访问该子类对象中特有的方法,只能访问父类有的方法
如果需要通过该对象,访问子类的特有的方法等,那么就需要向下转型
Overload和Override的区别
Overload:方法的重载
在同一类,方法名称相同,形参列表不同的两个或多个方法称为重载。
Override:方法的重写
在子类继承父类时,如果父类的方法实现不适用于子类,子类就可以对父类的方法进行重写,覆盖。
标签:继承,子类,面向对象,Student,父类,方法,属性 From: https://www.cnblogs.com/woniupa/p/17133151.html