1.封装
指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法
优点
- 良好的封装能够减少耦合
- 类内部的结构可以自由修改
- 可以对成员变量进行更精确的控制
- 隐藏信息,实现细节
诀窍
属性私有,get/set
私有:private
student类
public class Student {
private int age;
private String name;
//alt+insert
//this表示这个类
public int getAge() {
return age;
}
public String getName() {
return name;
}
public void setAge(int age) {
//可以增加判断语句
this.age = age;
}
public void setName(String name) {
this.name = name;
}
}
Appliction类调用student类
public class Appliction {
public static void main(String[] args) {
Student stu = new Student();
stu.setName("小智");
System.out.println(stu.getName());
}
}
2.继承
本质是对某一批类的抽象,从而实现对现实世界更好的建模。所有的类都继承object.只有单继承,没有多继承。
权限控制表
修饰词 | 本类 | 同一个包的类 | 继承类 | 其他类 |
---|---|---|---|---|
private | √ | × | × | × |
无(默认) | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |
继承的语法
public class 子类 extends 父类{}
访问表现
- private修饰的属性或方法为该类所特有,在任何其他类中都不能直接访问;
- default修饰的属性或方法具有包访问特性,同一个包中的其他类可以访问;
- protected修饰的属性或方法在同一个中的其他类可以访问,同时对于不在同一个包中的子类中也可以访问;
- public修饰的属性或方法外部类中都可以直接访问。
//父类
public class Person {
public int money = 1_0000_0000;
public void test(){
System.out.println("my is person");
}
}
//子类
public class Student extends Person {
}
super和this
this的用法
构造方法是创建java对象的重要途径,通过new关键字调用构造器时,构造器返回该类的对象,但是这个对手并不是完全由构造器负责创建. 创建一个对象分为如下四步:
- 分配对象空间,并将对象成员变量初始化为0或者null
- 执行属性值的显式初始化
- 执行构造方法
- 返回对象的地址给相关变量
this就是对象的地址
public class Student {
String name = "xiaoou";
public String getName() {
return name;
}
public String eclass(String name){
this.name = name;
return this.name;
}
}
public static void main(String[] args) {
Student student = new Student();
String name = student.getName();
System.out.println(name);
String xiaozhi = student.eclass("xiaozhi");
System.out.println(xiaozhi);
}
super
注意点
- super调用父类的构造方法,必须在构造方法的第一个
- super必须只能出现在子类的方法或者构造方法中
- super和this不能同时调用构造函数
调用父类的字段
public class Person {
//父类的protected成员是包内可见的,并且对子类可见
protected String name = "小欧";
}
public class Student extends Person{
String name = "小智";
public void test(String name){
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
}
调用父类的方法
public class Person {
public void print(){
System.out.println("person");
}
}
//学生类继承person类,就会拥有父类的全部方法
public class Student extends Person{
public void print(){
System.out.println("student");
}
public void test1(){
print();
this.print();
super.print();
}
}
super调用构造器得先执行父类构造函数
public class Person {
//构造函数
public Person() {
System.out.println("this is person");
}
}
//学生类继承person类,就会拥有父类的全部方法
public class Student extends Person{
//构造函数
public Student() {
//隐藏代码super():调用父类的无参构造
//super();//调用父类的构造器,必须要在子类构造器的第一行
System.out.println("this is student");
}
}
//输出结果
//this is person
//this is student
this和super的区别
代表的对象不同
- this:本身调用者这个对象
- super:代表父类对象的应用
前提
- this:没有继承也可以使用
- super:必须继承才能使用
构造方法
- this()本类的构造
- super()父类的构造
方法重写
必须有继承关系,与属性无关,子类重写父类的方法,子类的方法必须和父类一致:方法体不同
- 方法名必须相同
- 参数列表必须相同
- 修饰符:范围可以扩大但不能缩小:public>Protected>Defalt>private
- 抛出的异常:范围,可以被缩小,但不能扩大:ClassNotFoundException --> Exception(大)
IDEA重写快捷键ctrl+o
public class B {
public void test(){
System.out.println("hello world");
}
}
public class A extends B {
//重写Override(快捷键ctrl+o)
@Override //注解
public void test() {
System.out.println("this is A");
}
}
为什么需要重写方法?
父类的功能,子类不一定需要,或者不一定满足!
3.多态
- 动态编译:类型:可扩展性
- 同一个方法可以根据发送对象的不同采用多种不同的行为方式
- 一个对象的实际类型是确认的,但可以指向对象的引用的类型有很多
多态存在的条件
- 有继承关系
- 子类重写父类方法
- 父类引用指向子类对象
注意:
- 多态是方法的多态,属性没有多态
- 父类和子类,有联系 类型转换异常!ClassCastException!
- 存在条件:继承关系,方法需要重写,父类引用指向子类对象!
- 如果都存在该方法,就只执行子类的该方法
如果都存在该方法,就只执行子类的该方法(实例)
public class Person {
protected void run(){
System.out.println("person");
}
}
public class Student extends Person {
@Override
protected void run() {
System.out.println("student");
}
}
没有多态的关键字(不能重写)
- static方法:属于类,它不属于实例(静态)
- final 常量
- private方法:私有的
instanceof和类型转换
instanceof
判断一个对象是什么类型
语法
对象 instanceof 类型
Object object = new Student();
//判断是不是Student类型
System.out.println(object instanceof Student);//true
对象类型转换
- 父类引用指向子类的对象
- 把子类转换为父类,向上转换;
- 把父类转换为子类,向下转换:(强制转换)(可能丢失精度)
- 方便方法的调用,减少重复代码
原则和基本类型转换一致 高 -->低(强制转换)
public class Person {
}
public class Student extends Person {
protected void eat(){
System.out.println("小心心到吃东西");
}
}
Student student = new Student();
Person person = new Student();
//类型转换
((Student)person).eat();
static关键字
static声明的成员变量为静态成员变量,也成为类变量 ,可以直接调用
应用
- 静态属性
- 静态方法
- 静态导入包
//静态属性(可以直接调用)
static int age = 10;//静态变量
int age1 = 10;//非静态变量
//静态方法(可以直接调用)
public void test(){
System.out.println("this is 非静态方法");
}
public static void test1(){
System.out.println("this is 静态方法");
}
//静态导入包
import static java.lang.Math.random;
public static void main(String[] args) {
System.out.println(random());
}
静态代码块 、匿名代码块 、构造方法执行顺序
public class Person {
//第二
//匿名代码块
{
System.out.println("匿名代码块");
}
//第一
//静态代码块
static {
System.out.println("静态代码块");
}
//第三
//构造方法
public Person() {
System.out.println("构造方法");
}
//执行顺序
//1.静态代码块 2.匿名代码块 3.构造方法
public static void main(String[] args) {
Person person = new Person();
}
}
先执行静态代码块,然后是匿名代码块,最后构造方法
静态代码块只执行一次,匿名代码块可以用来赋值