面向对象OOP
代码块:{在Java中使用花括号括起来的代码叫做代码块}
分类:局部代码块,构造代码块,静态代码块,同步代码块(多线程)
局部代码块:在方法中的代码块 可以使用方法中的局部变量 局部代码块中的变量出了局部代码块就会被释放
构造代码块(初始化块):在类中的方法外出现 多个构造方法中的相同代码存在一起 每次调用构造方法都会执行 并且在构造方法前执行 使用场景(在使用数据库时用来加载数据库的驱动)
静态代码块:在代码块前加上static修饰 用来给类进行初始化 在加载的时候就执行 并且只执行一次 在开发过程中也是用来加载驱动的 优先与构造方法执行
子类加载前会先加载父类进内存
继承Extends:子类(派生类)继承父类(基类)
子类继承父类后 子类会拥有一份和父类一样的数据(属性和方法)
public class Dog extends Animal{
//子类继承父类后 子类会拥有一份和父类一样的数据(属性和方法)
}
public class Animal {
String name;//名字
String color;//颜色
int legs;//腿的数量
public void cry(){
System.out.println("叫!");
}
}
public class Test_Extends {
public static void main(String[] args) {
Dog d=new Dog();
d.name="小黑";
d.color="黑色";
d.legs=4;
d.cry();
System.out.println(d.name+d.color+ d.legs);
}
}
继承的好处:提高代码复用性 提高代码的维护性 让类和类之间产生了关系 是多态的前提
继承的弊端:会强加给与子类一些子类不需要的功能 类的耦合性增强
java中类的继承特点:只支持单继承 不支持多继承(一个儿子只能有一个爹)
支持多层继承(子类继承父类,孙类继承子类。。。)最底层的类具备继承体系中的所有功能
私有的属性和方法不能被继承!
继承的注意事项:子类只能继承父类所有的非私有成员(成员属性,成员方法)
子类不能继承父类的构造方法 但是可以通过关键字super访问父类的构造方法
不要为了部分的功能而去继承
开发的原则:高内聚(内聚:自己完成某件事情的能力) 低耦合(耦合:类和类之间的关系)
如果子类中的变量与父类中的变量同名那么 就近原则
this和super的区别:this.成员变量 ,super.成员变量
this代表当前对象的引用 谁来调用我 我就代表谁(可以调用本类的成员变量 也可以调用父类的成员变量)
super代表当前对象父类的引用(只能调用父类的成员变量)
子类中的所有构造方法默认都会访问父类中的空参构造方法( 打印输出的话都是先父类再子类)
因为子类会继承父类中的数据 可能还会使用父类中的数据 所以子类初始化前 一定要先完成父类数据的初始化
每个构造方法的第一条语句默认都是:super()
父类继承与Object Object最顶层的父类
this和super的示例代码:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void show(){
System.out.println(name+"--"+age);
}
}
public class Student extends Person{
String classNo;
public Student (String name, int age){
super(name,age);//在这调用父类的有参构造
}
public Student(String name,int age,String classNo){
super(name,age);
this.classNo=classNo;
}
public void show(){
super.show();
System.out.println(classNo+"--"+sex);
}
char sex;
public Student(String name,int age,String classNo,char sex){
//第一种方法
/* super(name,age);
this.classNo=classNo;
this.sex=sex;*/
//第二种方法 提高java代码复用
this(name,age,classNo);//开发中推荐 调用本类中三个参数的构造方法
this.sex=sex;
}
}
public class Demo {
public static void main(String[] args){
Student s=new Student("张三",23,"计算机班",'男');
s.show();
}
}
重写:子父类中出现了一模一样的方法
重新应用:当子类需要父类的功能 而功能主体子类有自己特有内容时 可以重写父类的方法 这样既沿袭了父类的功能 又定义了子类特有的功能
返回值类型可以是父类也可以是子类
重写代码示例:
public class Phone {
public void call(){
System.out.println("打电话");
}
}
public class Phone3G extends Phone{
public void sendMsg(){
System.out.println("发短信");
}
}
public class Phone4G extends Phone3G{
public void sendMsg(){
super.sendMsg();
System.out.println("发微信");
}
public void playGame(){
System.out.println("打游戏");
}
}
public class Demo {
public static void main(String[] args) {
Phone4G p=new Phone4G();
p.call();
p.sendMsg();
p.playGame();
}
}