2.通过\类实现类的继承。 * 子类:A 父类(或基类 SuperClass):B *
* 3.子类继承父类以后,父类中声明的属性、方法,子类就可以获取到。
* 明确:当父类中有私有的属性或方法时,子类同样可以获取得到,只是由于封装性的设计,使得子类不可以直接
* 调用罢了。
* 子类除了通过继承,获取父类的结构之外,还可以定义自己的特有的成分。 *
* extends:子类是对父类功能的“扩展”,明确子类不是父类的子集。 * * 4.java中类的继承性只支持单继承:一个类只能继承一个父类。反之,一个父类可以有多个子类。 * 5.子父类是相对的概念。
1.方法的重写(override orverwrite) vs 重载(overload)
【面试题】方法的重载与重写的区别? 重载:“两同一不同”:同一个类,同一个方法名,不同的参数列表。 注:方法的重载与方法的返回值无关! >构造器是可以重载的 重写:(前提:在继承的基础之上,子类在获取了父类的结构以后,可以对父类中同名的方法进行“重构”) 方法的返回值,方法名,形参列表形同;权限修饰符不小于父类的同名方法;子类方法的异常类型不大于父类的;
两个方法要同为static或同为非static。
public void method1(String[] str,int age) throws Exception{ }
class Cirlce{
//求圆的面积
public double findArea(){
} }
class Cylinder extends Circle{ //求圆柱的表面积
public double findArea(){ } }
2.关键字super
1.super,相较于关键字this,可以修饰属性、方法、构造器
2.super修饰属性、方法:在子类的方法、构造器中,通过super.属性或者super.方法的形式,显式的调用父类的指定
属性或方法。尤其是,当子类与父类有同名的属性、或方法时,调用父类中的结构的话,一定要用“super.”
3.通过“super(形参列表)”,显式的在子类的构造器中,调用父类指定的构造器! >任何一个类(除Object类)的构造器的首行,要么显式的调用本类中重载的其它的构造器“this(形参列表)”或显式的调用父类中
指定的构造器“super(形参列表)”,要么默认的调用父类空参的构造器\>建议在设计类时,提供一个空参的构造器!
3.子类对象实例化的全过
//子类对象实例化的全过程 public class TestDog { public static void main(String[] args) { Dog d = new Dog(); d.setAge(10);
d.setName(\小明\ d.setHostName(\花花\ System.out.println(\ + \ System.out.println(d.toString()); } }
// 生物
class Creator { private int age; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Creator() { super(); System.out.println(\ } }
// 动物类
class Animal extends Creator { private String name; public String getName() { return name;
}
}
public void setName(String name) { this.name = name; }
public Animal() { super(); System.out.println(\}
// 狗
class Dog extends Animal { private String hostName; public String getHostName() { return hostName; } public void setHostName(String hostName) { this.hostName = hostName; } public Dog() { super(); System.out.println(\ } }
4.面向对象的特征三:多态性
1.多态性的表现:①方法的重载与重写 ②子类对象的多态性 2.使用的前提:①要有继承关系 ②要有方法的重写 3.格式:Person p = new Man();//向上转型
// 虚拟方法调用:通过父类的引用指向子类的对象实体,当调用方法时,实际执行的是子类重写父类的方法
p1.eat(); p1.walk(); // p1.entertainment();
4.>编译时,认为p是Person类型的,故只能执行Person里才有的结构,即Man里特有的结构不能够调用 >子类对象的多态性,并不使用于属性。
5.关于向下转型:
①向下转型,使用强转符:()
②为了保证不报ClassCastException,最好在向下转型前,进行判断: instanceof // 若a是A类的实例,那么a也一定是A类的父类的实例。
if (p1 instanceof Woman) { System.out.println(\ Woman w1 = (Woman) p1; w1.shopping(); }
if (p1 instanceof Man) { Man m1 = (Man) p1; m1.entertainment(); }
Object类
1.java.lang.Object 类,是所有类的根父类!
2.Object类仅有一个空参的构造器 public Object(){ }
3.关于方法:
① equals(Object obj)
public boolean equals(Object obj) { return (this == obj); } // ==
// 1.基本数据类型:根据基本数据类型的值判断是否相等。相等返回true,反之返回false // 注:两端数据类型可以不同,在不同的情况下,也可以返回true。 // 2.引用数据类型:比较引用类型变量的地址值是否相等。
//equals():
>①只能处理引用类型变量②在Object类,发现equals()仍然比较的两个引用变量的地址值是否相等 >像String 包装类 File类 Date类这些重写Object类的equals()方法,比较是两个对象的 //\实体内容\是否完全相同。
>若我们自定义一个类,希望比较两个对象的属性值都相同的情况下返回true的话,就需要重写Object类的
equals(Object obj)方法
② toString()方法
当我们输出一个对象的引用时,会调用toString()方法。 1.public String toString() {
return getClass().getName() + \ }
当我们没有重写Object类的toString()方法时,打印的就是对象所在的类,以及对象实体在堆空间的位置 2.一般我们需要重写Object类的toString()方法,将此对象的各个属性值返回。 3.像String类、Date、File类、包装类都重写了toString()方法。 包装类
基本数据类型由于不是类,不能够使用java类库里提供的大量的方法。所有在设计上, 我们让每一个基本数据类型都对应一个类,同时数据存储的范围还不变。此时相当于 基本数据类型就具有了类的特点。这些类即为包装类(wrapper 或封装类)
我们需要掌握的:
基本数据类型、包装类、String类之间的转换!
简易版:
1.基本数据类型与对应的包装类有自动装箱、自动拆箱 如:int i = 10;
Integer i1 = i;//自动装箱 int j = i1;//自动拆箱
2.基本数据类型、包装类---->String类:调用String类的重载的valueOf(Xxx xx); String类---->基本数据类型、包装类:调用相应的包装的parseXxx(String str); 注意:String str = \
int i = (int)str;是错误的转法。
五、面向对象(三)
1.static关键字
1.static:静态的,可以用来修饰属性、方法、*代码块(或初始化块)、*内部类 2.
static修饰属性(类变量):
* 1.由类创建的所有的对象,都共用这一个属性
* 2.当其中一个对象对此属性进行修改,会导致其他对象对此属性的一个调用。vs 实例变量(非static修饰的属性,各个对象各自拥有一套副本)
* 3.类变量随着类的加载而加载的,而且独一份
* 4.静态的变量可以直接通过“类.类变量”的形式来调用
* 5.类变量的加载是要早于对象。所以当有对象以后,可以“对象.类变量”使用。但是\类.实例变量\是不行的。
* 6.类变量存在于静态域中。 * * static修饰方法(类方法):
* 1.随着类的加载而加载,在内存中也是独一份 * 2.可以直接通过“类.类方法”的方式调用
* 3.内部可以调用静态的属性或静态的方法,而不能调用非静态的属性或方法。反之,非静态的方法是可以调用静态的属性或静态的方法
* >静态的方法内是不可以有this或super关键字的!
* 注:静态的结构(static的属性、方法、代码块、内部类)的生命周期要早于非静态的结构,同时被回收也要晚于非静态的结构
public class TestCircle { public static void main(String[] args) { Circle c1 = new Circle(); Circle c2 = new Circle(2.3); System.out.println(c1); System.out.println(c2); System.out.println(Circle.getTotal());

