第六章

第六章 面向对象基本特征

6.1 封装

  • 隐藏实现细节, 方便使用者使用
  • 安全, 可以控制可见范围
修饰符 当前类 同一包内 其他包子类 其他包
public Y Y Y Y
protected Y Y Y N
default Y Y N N
private Y N N N
public class Student {
	private String name;
	private int age;
	
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

6.2 构造

实例化类就会执行构造器

public class Student {
	private String name;
	private int age;
	
	public Student(){
		
	}
	
	public Student(String name, int age){
		this.name = name;
		this.age = age;
	}
}

6.3 this

当前对象

用法

  • this.属性

    public class Student{
    	private int score;
    	public void setScore(int score) {
    		this.score = score;
    	}
    }
    
  • this.方法
    同直接调用方法

  • this()

    public class Student{
    	private int score;
    
    	public Student() {
    	}
    
    	public Student(int score) {
    		this();
    		this.score = score;
    	}
    }
    

6.4 包

  • 避免重名
  • 分类组织管理众多的类(java.lang, java.util, java,io)
  • 控制可见范围

语法格式

package 包名;

必须在源文件代码首行
一个源文件只能有一个包

命名规范

  • 所有单词都小写每个单词用 . 分割
  • 公司域名倒置(com.baidu.xxx)

使用其他包的类

  • 使用类型的全名称

    java.uitl.Scanner input = new java.uitl.Scanner(System.in);
    
  • 使用import

    import 包.类名;
    

6.5 继承

代码复用
代码扩展

语法

[修饰符] class 类名 extends 父类 {
}

特点

  • 子类会继承父类所有非私有属性, 方法
  • 不会继承构造器但是会调用父类构造器
  • java只支持单继承
  • java可以多层继承, 会代代相传

6.6 重写 Override

父类的方法对子类不合适可以这么做

  • 方法名, 形参列表必须相同
  • 权限修饰符必须 >= 父类
  • 返回值
    基本数据类型和void必须相同
    引用数据类型必须 <= 父类

重载(Overload)和重写(Override)的区别

重载(Overload)在一个同类中, 方法名相同, 形参列表不同,和返回值类型无关的两个或多个方法

特殊的重载

public class TestOverload {
	public static void main(String[] args) {
		B b = new B();
		b.a();
		b.a(null);
		//b有.a()和.a(str)方法,算是重载
	}
}

class A{
	public void a(){
	}
}

class B extends A {
	public void a(String str){
	}
}

6.7 关键字 super

引用父类

  • super.属性
    重写父类属性后可以这样调用父类属性
  • super.方法
    重写父类方法后可以这样调用父类方法
  • super(), super(参数列表)
    调用父类构造器

必须在构造器首行
子类没写默认也调用父类构造器

6.8 非静态代码块'

public class temp {
	{
		非静态代码块
	}
}
  • 在创建对象时, 为对象赋值, 协助完成实例初始化
    • 每次创建对象都会执行
    • 优于构造器执行

6.9 实例初始化过程

  • 实例初始化过程: 实例创建的过程
  • 实例初始化方法: 实例对象创建时要执行的方法
  • 实例初始化方法由编译器编译生成
  • 实例初始化方法的形式: <init>() 或 <init>(形参列表)
  • 实例初始化方法的构成
    • 属性的显式赋值代码
    • 非静态代码块的代码
    • 构造器的代码

属性的显式赋值代码和非静态代码块的代码按上下顺序执行
构造器的代码最后执行

一个类有几个构造器, 就有几个实例初始化方法

父子类的实例初始化

  • super() 和 super(实参列表) 调用了父类实例化方法
  • super() 和 super(实参列表) 必须在子类实例化初始方法的首行

先执行父类的实例初始化方法, 在执行子类的实例初始化方法

6.10 多态

父类 标识符 = 子类;
  • 编译时看左边父类, 运行时看右边子类

上转型

自动转换

下转型

强制类型转换

//必须保证这个对象是子类或者子类的子类( >= 强转的类型)
(子类)标识符;

instanceof

//返回 true 或 false, 返回true说明可以强转右边
对象/变量 instanceof 类型
posted @ 2020-02-19 10:48  烟熏咸鱼干  阅读(173)  评论(0编辑  收藏  举报