一、构造器赋值内存图
public class Dog {
public String name;
public int age;
public double height;
public void eat() {
System.out.println("吃饭呢,好香");
}
public void sleep() {
System.out.println("zzz");
}
public Dog() {
}
public Dog(String n,int a,double h) {
name = n;
age = a;
height = h;
}
}
Dog d1 = new Dog("大黄", 3, 100);
Dog d2 = new Dog("米泡泡",4,150);
Dog d3 = new Dog();
System.out.println(d1.name);
System.out.println(d2.name);
System.out.println(d3.name);
image.png
public class Dog {
public String name = "小贝";
public int age = 2;
public double height = 120;
public void eat() {
System.out.println("吃饭呢,好香");
}
public void sleep() {
System.out.println("zzz");
}
public Dog() {
}
public Dog(String n,int a,double h) {
name = n;
age = a;
height = h;
}
}
Dog d1 = new Dog();
Dog d2 = new Dog();
Dog d3 = new Dog("大黄", 3, 100);
Dog d4 = new Dog("米泡泡",4,150);
System.out.println(d1.name);
System.out.println(d2.name);
System.out.println(d3.name);
System.out.println(d4.name);
image.png
二、this关键字
1、this.属性或this.方法
方法内变量归属采取就近原则,即和形参一致,为了消除这一现象,可采取形参和属性不一致或this.属性指向当前对象的属性
2、this()
写到构造方法第一行(只能写第一行),调用本类的其他构造方法
三、static
静态,可以修饰属性、方法、代码块、内部类,“跟着类走”,当类型信息加载到方法区时,static修饰的成员就完成了初始化,因此,在测试类中,调用static修饰的成员,用类名.成员,即可完成调用,也可以用对象.成员,因为static修饰的成员在对象创建之前已完成了初始化
非static修饰的成员,需要在创建对象后,完成初始化,因此只能通过对象.成员调用
四、static成员与非static成员互相调用
1、本类中
(1)static方法调用static成员,直接变量名或方法名(值)
(2)static方法调用非static成员,需要创建对象,然后对象.属性或对象.方法(值)
(3)非static方法调用static成员,非static方法需要创建对象才能调用,此时static成员早已完成了初始化,因此直接属性名或方法名(值)
(4)非static方法调用非static成员,都是被同时初始化的,因此直接属性名或方法名(值)调用
2、其它类中
(1)static方法调用static成员,使用类名.属性、类名.方法名(值)或者对象.属性、对象.方法名(值)调用
(2)static方法调用非static成员,需要创建对象,然后对象.属性或对象.方法(值)
(3)非static方法调用static成员,使用类名.属性、类名.方法名(值)或者对象.属性、对象.方法名(值)调用
(4)非static方法调用非static成员,需要创建对象,然后对象.属性或对象.方法(值)调用
五、为什么主方法要设计成static
因为需要无对象首先被执行
六、static执行的时机
{}放到方法中,叫普通代码块,作用是在普通代码块中声明的变量,不让外界随意获取
{}放到方法外,叫构造代码块,配合构造方法创建对象
static{},叫静态代码块,只被加载一次,优先于其他代码块,常用于程序执行前的准备工作,比如读取配置文件
静态代码最先被执行
其次是构造代码块
最后是构造方法
七、关于共享
类中的static资源由类和它所有的对象共享
八、继承
继承是类和类之间的关系
父类(超类、基类)
子类(派生类)
九、继承的条件
满足以下任意条件的即认为构成继承关系
1、A is B A继承了B
2、子类对象可以当作父类对象去用
十、如何写继承
extends
public class B extends A{
}
此时,A是父类,B是子类
十一、关于继承的说明
1、一个类有且仅有一个直接父类,但是可以有很多间接父类,即java号称的“单继承、多实现(后续接口中会详细说)”
2、一个类如果没有明确写出继承自谁,那就继承自java官方提供的Object(上帝类),Object是java中唯一一个没有父类的类
Everything is Object 万物皆对象
3、反过来,一个类可以有多个直接子类
4、对象创建的过程(涉及继承),要创建一个类的对象,需要找出继承关系,把继承树最顶端的那个类创建出对象,然后才创建后续子类对象,原因是jvm在类的构造方法第一行加上了super();,表示调用父类的构造方法,当然也可手动指定调用父类其他的有参构造方法
5、当父类只有有参构造方法时,子类会报错,解决的方式:
(1)为父类添加一个无参构造方法
(2)在子类构造方法中手动调用父类有参构造方法
image.png
6、super调父类构造方法的妙用
public Car(String brand,String color,double speed,int loadPersonCount) {
super(brand,color,speed);
this.loadPersonCount = loadPersonCount;
}
image.png
7、对于从父类继承过来的属性,可以使用this.或者super.指定
而子类自己的属性,只能用this.指定
8、子类从父类继承属性和方法,如果子类与父类属性名一致,创建子类对象取子类自己的属性值,方法也一样
十二、重写
@Override重写注解
1、权限修饰符,重写后范围要不小于重写前范围
2、返回值类型,是void和基本数据类型,重写前后必须一致
是引用数据类型,重写前后要一致或重写后是重写前的子类
3、方法名相同
4、参数个数、类型、顺序一致
5、
练习:
创建车的总类Vehicle,有有品牌、颜色、速度等属性,还有两个构造方法,一个无参、一个为所有属性赋值,还有个pay方法,用于支付车费
创建三个子类,具体是:
大卡车,继承父类属性外有载货量属性,重写pay,打印支付30元车费
公交车,继承父类属性外有载量属性,重写pay,打印支付20元车费
小汽车,继承父类属性外有载量属性,重写pay,打印支付10元车费
以上三个子类军提供两个构造方法,一个无参,另一个为父类和自己属性赋值
作业
沈北某师范学校有100名计算机专业的毕业生,现在沈北某狼机构有三名咨询老师,这些老师随机招纳学生来学习,打印出招生的语句,并记录每名老师招生的数量,根据招生数量从高到低排序
网友评论