04Java面向对象_回顾----构造器、封装继承多态、instanceof、this、Super、接口、内部类等
面向对象编程概述
面向对象编程(Object-Oriented Programming,OOP)
面向对象编程的本质就是:以类的方式组织代码,以对象的方式组织(封装)数据
抽象
三大特性:
- 封装是指属性私有化
- 根据需要提供setter和getter方法来访问属性
- 隐藏具体属性和实现细节,仅对外开放接口
- 控制程序中属性的访问级别
- 继承是指将多个相同的属性和方法提取出来,新建一个父类
- Java中一个类只能继承一个父类,且只能继承访问权限非private属性和方法
- 子类可以重写父类中的方法,命名与父类中同名的属性
- 多态可以分为两种:设计时多态、运行时多态
- 设计(编译)时多态:即重载(Overload),是指java允许方法名相同而参数不同(返回值可以相同也可以不同),同一个类中允许存在一个或多个以上的同名函数,只要参数类型或参数个数不同即可
- 运行时多态:即重写(Override)必须是在继承体系中,子类重写父类方法,JVM运行时根据调用该方法的类型决定调用那个方法
类的方法
- 静态方法 static 可以直接类名调用
- 注意点:静态方法中不能用非静态方法,原因是static和类一起加载,而非静态方法是对象创建才存在的。
- 非静态方法 需要实例化一个对象来调用
引用传递
对象引用传递的本质还是值传递
Person p=new Person();
p.chage(p);//修改名字
//输出之后名字被修改了 ,因为是new
int a=1;
change(a);
//输出之后没有修改
创建和初始化对象
- 使用new关键字创建对象
- 构造器也成为构造方法,在创建对象的时候调用
- 它必须和类的名字相同
- 没有返回类型不能写void
构造器
- 一个类如果什么都不写,自带一个无参构造器
- 一旦定义了有参构造,无参就必须显式定义否则无效
- IDEA 中alt+Insert 健自动生成构造函数
public class Student{
int age;
String name;
public Student(){
this.name="Nihao";
this.age=21;
}
public Student(String name,int age){ //有参构造
this.name=name;
this.age=age;
}
public String getName(){
String name="QQ"
return this.name; //this表示当前类的属性,两个name不一样
}
}
创建对象内存分析
方法区在堆里,static方法和类一起加载,非static在创建对象之后才能加载。
this
public class Student{
int age;
String name;
public String getName(){
String name="QQ"
return this.name; //this表示当前类的属性,两个name不一样
}
}
封装
- 高内聚,低耦合。高内聚就是类的内部数据细节自己完成,不允许外部干涉;低耦合,仅暴露少了方法给外部使用
- 属性私有,get/set
好处:
- 提高程序的安全性,保护数据
- 隐藏代码的实现细节
- 统一接口
- 系统可维护增加了
public class Student{
private int age; //增加private
private String name;
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public String getName(){
String name="QQ"
return this.name; //this表示当前类的属性,两个name不一样
}
}
继承
使用关键字 extends
可以继承父类的全部public方法和属性
不能继承父类private的方法和属性
一般属性都是private,方法是public 的
final 标注类之后 不能被继承
在Java中所有类默认继承Object类。 IDEA 快捷键 ctrl+h 查看所有结构
Super
Super指强调 调用父类的属性或者方法 ,注意不能调用私有的父类方法
调用父类的构造器必须在子类构造器的第一行,否则会报错;如果不写会默认调用
super()和this()不能同时出现在构造器中
重写
重写都是方法的重写,和属性无关
- 重写方法名必须相同
- 参数列表需要相同
- 修饰符:范围可以扩大但不能缩小
- 抛出的异常:范围可以缩小但不能扩大:Exception()->ClassNotFoundException()
重点: 重写静态方法和重写非静态方法不同
- 重写静态方法
- 重写非静态方法
为什么会这样呢?因为静态方法是类的方法,而不是对象的方法,有static时,b调用B类的方法,因为b时用B类定义的,没有static时,b调用的时对象的方法,而b是用A类new的,因此调用A的方法。
为什么要重写?
- 父类的功能,子类不一定需要,或者不一定满足
多态
多态:即同一方法可以根据发送对象的不同而采用多种不同的行为方式
一个对象的实际类型是确定,但可以指向对象的引用的类型有很多
Student s1=new Student();
Person s2= new Student();
//其中s1能调用的方法都是自己的或者继承父类的 方法
//其中s2能指向并执行子类重写的方法,但是不能调用子类独有的方法
我们可以通过类型转换来调用
如//(Student)s2
多态注意事项
- 多态是方法的多态,属性没有多态
- 存在关系:有继承关系,方法需要重写,父类引用指向子类对象
- static方法 属于类,它不属实例,不能算是重写
- final常量 重写不了
- private方法 也重写不了
- 一般是重写和多态挂钩
instanceof
instanceof 是 Java 的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型
Static
static 的静态变量,被所有该类创建的实例共享!即只有一个!
静态代码块是最早执行的 ,和类一起加载并执行一次,其次才是匿名代码块
我们在创建一个实例
可以看见静态代码块没了,说明他只执行一次!
我们也可以通过匿名代码块来赋初始值,就和构造器一样。
静态导入包
我们都知道 Math这个类里面有random()函数,那么直接执行以下代码是错误的import java.lang.Math.random
,发现会在random这里标红
但是我们可以静态导入包即 import static java.Math.random
这样就可以直接使用random了 System.out.println(random())
Abstract 类
public abstract class Action{
}
public abstract void teset();
在子类继承的时候 要实现父类的abstract方法
抽象的方法不能new。
抽象类中可以写普通方法
抽象类也存在构造器
接口
类可以实现多接口
public interface UserService{
public static final int age=99; //所有的属性都是默认 public static final 的常量
void run();//其中的方法不能在接口中实现
public abstract void run();
//他们本身就是默认public abstract的
}
public interface Time{
void time();
}
public class UserServiceImp implements UserService,Time{
public void run();
}
结构不能被是咯话,接口中没有构造方法
内部类
public class Outer {
private int id;
public void out(){
System.out.println("这是外部类");
}
public class Inner//成员内部类 +加一个static就变成静态内部类
public void in(){
System.out.println("这是内部类");
}
public void getId(){
System.out.println(id); //可以获得外部类的私有属性
}
}
public void method(){
class Inner2{ //局部内部类
public void in(){
}
}
}
public static void main(String[] args) {
Outer outer = new Outer();
Inner inner = outer.new Inner();
new Outer().method();;//匿名内部类
//正常情况下是不能实例化interface ,这里是匿名内部类
Userservice userservice = new Userservice() {
@Override
public void hello() {
}
};
}
}
interface Userservice{
void hello();
}
IDEA 技巧
-
增加一个目录 如out文件 File-Project Structure- Modules–Source-add Content Root
-
IDEA 中alt+Insert 健自动生成构造函数
-
在某一个类中按下 CTRL+H可以打开这个类的继承结构
- alt+insert 后可以选择override达到快捷自定义重写
Tips
- 一个java文件里只能有一个public 类