继承
继承实现类的扩展
父类也称作超类、基类、派生类等。
Java中只有单继承,没有像C++那样的多继承。多继承会引起混乱,使得继承链过于复杂,系统难于维护。
Java中类没有多继承,接口有多继承。
子类继承父类,可以得到父类的全部属性和方法 (除了父类的构造方法 ),但不见得可以直接访问(比如,父类私有的属性和方法)。
如果定义一个类时,没有调用extends,则它的父类是:java.lang.Object。
package MyPro05;
class Person {
String name;
int height;
public void rest ( ) {
System. out. println ( "休息..." ) ;
}
}
class Student extends Person {
String major;
public Student ( ) {
}
public Student ( String name, int height, String major) {
this . name = name;
this . height = height;
this . major = major;
}
public void study ( ) {
System. out. println ( "学习..." ) ;
}
}
public class TestExtends {
public static void main ( String[ ] args) {
Student stu = new Student ( ) ;
stu. name = "霹雳火秦明" ;
stu. height = 189 ;
stu. study ( ) ;
stu. rest ( ) ;
}
}
查看类的继承关系,选中类后,IDEA中快捷键Ctrl+h,或者右键diagram
instanceof: instanceof是二元运算符 ,左边是对象,右边是类;当对象是右面类或子类所创建对象时,返回true;否则,返回false。是个运算符,像 + - * /那样用
System. out. println ( stu instanceof Student ) ;
System. out. println ( stu instanceof Person ) ;
重写
子类替换父类的行为。
“==”: 方法名、形参列表相同。
“≤”:返回值类型和声明异常类型,子类小于等于父类。子类方法的返回类型是父类方法返回类型的本身或子类。
“≥”: 访问权限,子类大于等于父类。
class Veichle {
void run ( ) {
System. out. println ( "跑...." ) ;
}
void stop ( ) {
System. out. println ( "静止不动" ) ;
}
Person passager ( ) {
return new Person ( ) ;
}
int numbers ( ) {
return 1 ;
}
}
class Horse extends Veichle {
@Override
void run ( ) {
System. out. println ( "驾。。。驾。。。" ) ;
}
@Override
void stop ( ) {
System. out. println ( "吁。。。。" ) ;
}
@Override
Student passager ( ) {
return new Student ( ) ;
}
}
public class TestOverride {
public static void main ( String[ ] args) {
Horse h = new Horse ( ) ;
h. run ( ) ;
h. stop ( ) ;
}
}
快捷键 Alt + 7查看类的所有字段和方法
Object类
Object类是所有Java类的根基类,也就意味着所有的Java对象都拥有Object类的属性和方法。如果在类的声明中未使用extends关键字指明其父类,则默认继承Object类。
* Class {
@code Object} is the root of the class hierarchy.
* Every class has {
@code Object} as a superclass. All objects,
* including arrays, implement the methods of this class .
toString方法
public String toString ( ) {
return getClass ( ) . getName ( ) + "@" + Integer. toHexString ( hashCode ( ) ) ;
}
@Override
public String toString ( ) {
return "哈哈哈" ;
}
equals方法
== 符号,比较双方是否相同。如果是基本类型则表示值相等,如果是引用类型则表示地址相等即是同一个对象。
equals 判断提供定义“对象内容相等”的逻辑
public boolean equals ( Object obj) {
return ( this == obj) ;
}
自定义equals方法,单击右键generate自动生成
package MyPro05;
class User {
int id;
String name;
String passed;
public User ( int id, String name, String passed) {
this . id = id;
this . name = name;
this . passed = passed;
}
@Override
public boolean equals ( Object o) {
if ( this == o) return true ;
if ( o == null || getClass ( ) != o. getClass ( ) ) return false ;
User user = ( User) o;
return id == user. id;
}
}
public class TestEquals {
public static void main ( String[ ] args) {
User u1 = new User ( 1 , "玉麒麟" , "001" ) ;
User u2 = new User ( 1 , "卢俊义" , "002" ) ;
System. out. println ( u1 == u2) ;
System. out. println ( u1. equals ( u2) ) ;
}
}
super
super是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。使用super调用普通方法,语句没有位置限制,可以在子类中随便调用。
若是构造方法的第一行代码没有显式的调用super(…)或者this(…);那么Java默认都会调用super(),含义是调用父类的无参数构造方法 。这里的super()可以省略。构造时从祖宗Object往子孙开始构造,静态初始化块也是如此。
super . value;
super . method ( ) ;
属性/方法查找顺序:(比如:查找变量h) 1. 查找当前类中有没有属性h 。2. 依次上溯每个父类,查看每个父类中是否有h,直到Object 3. 如果没找到,则出现编译错误。 4. 上面步骤,只要找到h变量,则这个过程终止。
封装
作用:1. 提高代码的安全性。 2. 提高代码的复用性。 3. “高内聚”:封装细节,便于修改内部代码,提高可维护性。 4. “低耦合”:简化外部调用,便于调用者使用,便于扩展和协作。
访问控制符 修饰成员变量、方法,类可以default和public,1. private 表示私有,只有自己类能访问 2. default表示没有修饰符修饰,只有同一个包的类能访问 3. protected表示可以被同一个包的类以及其他包中的子类访问 4. public表示可以被该项目的所有包中的所有类访问
规则 1. 一般使用private访问权限。 2. 提供相应的get/set方法来访问相关属性,这些方法通常是public修饰的,以提供对属性的赋值与读取操作(注意:boolean变量的get方法是i