5.1继承性
class Person{
private String name;
private int age;
private Date birthDate;
public String getInfo(){
return "Person";
}
}
class Student extends Person{
public String school;
@Override
public String getInfo() {
return super.getInfo() + "Student";
}
}
// Student类继承了父类Person的所有属性和方法,并增加了一
//个属性school。Person中的属性和方法,Student都可以使用
为什么要有继承:
多个类存在相同的属性,将这些内容抽取到单独的一个类中,那么多各类无需再定义这些属性和行为,只要继承那个类即可
作用:
继承的出现减少了代码冗余,提高了代码的复用性。
继承的出现,更有利于功能的扩展。
继承的出现让类与类之间产生了关系,提供了多态的前提。
注意:不要仅为了获取其他类中某个功能而去继承
子类继承了父类,就继承了父类的方法和属性。
在子类中,可以使用父类中定义的方法和属性,也可以创建新的数据和
方法。
在Java 中,继承的关键字用的是“extends”,即子类不是父类的子集,而是对父类的“扩展”。
关于继承的规则:
子类不能直接访问父类中私有的(private)的成员变量和方法。
不能访问的原因:私有属性,方法只可以本类中调用
public class test1 {
public static void main(String[] args) {
Student1 student1 = new Student1();
System.out.println(student1.aver());
}
}
class Person1{
private String name;
private char sex;
private int age;
public Person1(String name, char sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public Person1() {
}
@Override
public String toString() {
return "Person1{" +
"name='" + name + '\'' +
", sex=" + sex +
", age=" + age +
'}';
}
}
class Student1 extends Person1{
private long number;
private int math;
private int english;
private int computer;
public Student1() {
}
public Student1(String name, char sex, int age, long number, int math, int english, int computer) {
super(name, sex, age);
this.number = number;
this.math = math;
this.english = english;
this.computer = computer;
}
@Override
public String toString() {
return "Student1{" +
"number=" + number +
", math=" + math +
", english=" + english +
", computer=" + computer +
"} " + super.toString();
}
public double aver(){
return 0.2;
}
public int max(){
return 1;
}
public int min(){
return 2;
}
}
package classTest3;
/**
* describe:
*
* @author suoliang
* @create 2021-06-22:52
*/
public class test2 {
public static void main(String[] args) {
Kids kids = new Kids();
kids.sex = 1;
kids.maxOrWoman();
}
}
class ManKind{
int sex;
private int salary;
public void maxOrWoman(){
if (sex == 1){
System.out.println("man");
}else if (sex == 0){
System.out.println("woman");
}else {
System.out.println("输入错误");
}
}
public void employee(){
if (salary == 0){
System.out.println("no job");
}else {
System.out.println("job");
}
}
}
class Kids extends ManKind{
private int yearsOld;
public void printAge(){
System.out.println(yearsOld);
}
}
package classTest3;
/**
* describe:
*
* @author suoliang
* @create 2021-06-23:56
*/
public class test3 {
public static void main(String[] args) {
Cylinder cylinder = new Cylinder();
System.out.println(cylinder.findVolume());
}
}
class Circle{
private double radius;
public Circle() {
this.radius = 1;
}
public Circle(double radius) {
this.radius = radius;
}
public double getRadius() {
return radius;
}
}
class Cylinder extends Circle{
private double length;
public Cylinder() {
this.length = 1;
}
public double getLength() {
return length;
}
public void setLength(double length) {
this.length = length;
}
public double findVolume(){
return Math.PI * getRadius() * getLength() * length;
}
}
5.2方法的重写
如果现在父类的一个方法定义成private访问权限,在子类中将此方法声明为default访问权限,那么这样还叫重写吗?(NO):子类不能重写父类中声明为private的方法;子类重写方法的访问权限不能小于父类,返回值类型不能大于父类
5.3四种访问权限修饰符
5.4关键字super
在Java类中使用super来调用父类中的指定操作:
super可用于访问父类中定义的属性
super可用于调用父类中定义的成员方法
super可用于在子类构造器中调用父类的构造器 注意:
尤其当子父类出现同名成员时,可以用super表明调用的是父类中的成员
super的追溯不仅限于直接父类 super和this的用法相像,this代表本类对象的引用,super代表父类的内存
空间的标识
package classTest3;
/**
* describe:
*
* @author suoliang
* @create 2021-06-0:45
*/
public class test4 {
public static void main(String[] args) {
Student student = new Student();
String info = student.getInfo();
System.out.println(info);
}
}
class Person{
protected String name = "张三";
protected int age;
public String getInfo(){
return "name: " + name + "\nage:" + age;
}
}
class Student extends Person{
protected String name = "李四";
private String school = "New Oriental";
public String getSchool(){
return school;
}
public String getInfo(){
return super.getInfo() + "\nschool: " + school;
}
}
public class Person {
private String name;
private int age;
private Date birthDate;
public Person(String name, int age, Date d) {
this.name = name;
this.age = age;
this.birthDate = d; }
public Person(String name, int age) {
this(name, age, null);
}
public Person(String name, Date d) {
this(name, 30, d);
}
public Person(String name) {
this(name, 30);
} }
public class Student extends Person {
private String school;
public Student(String name, int age, String s) {
super(name, age);
school = s;
}
public Student(String name, String s) {
super(name);
school = s;
}
// 编译出错: no super(),**系统将调用父类无参数的构造器**。
public Student(String s) {
school = s;
} }
1).为什么super(…)和this(…)调用语句不能同时在一个构造器中出现?
因为这样会调用两次父类
2).为什么super(…)或this(…)调用语句只能作为构造器中的第一句出现?
必须在构造器的第一行放置super或者this构造器,否则编译器会自动地放一个空参数的super构造器的
package classTest3;
/**
* describe:
*
* @author suoliang
* @create 2021-06-0:58
*/
public class test5 {
}
class Creature {
public Creature() {
System.out.println("Creature无参数的构造器");
}}
class Animal extends Creature {
public Animal(String name) {
System.out.println("Animal带一个参数的构造器,该动物的name为" + name);
}
public Animal(String name, int age) {
this(name);
System.out.println("Animal带两个参数的构造器,其age为" + age);
}}
class Wolf extends Animal {
public Wolf() {
super("灰太狼", 3);
System.out.println("Wolf无参数的构造器");
}
public static void main(String[] args) {
new Wolf();
}}
由父即子
5.6多态性:编译时:看左边,运行时:看右边
public class ConversionTest {
public static void main(String[] args) {
double d = 13.4;
long l = (long) d;
System.out.println(l);
int in = 5;
// boolean b = (boolean)in;
Object obj = "Hello";
String objStr = (String) obj;
System.out.println(objStr);
Object objPri = new Integer(5);
// 所以下面代码运行时引发ClassCastException异常
//对象与对象之间要有继承关系
String str = (String) objPri; } }
class Base {
int count = 10;
public void display() {
System.out.println(this.count);
} }
class Sub extends Base {
int count = 20;
public void display() {
System.out.println(this.count);
} }
public class FieldMethodTest {
public static void main(String[] args){
Sub s = new Sub();
System.out.println(s.count);
s.display();
Base b = s;//子类父类中都有count这个属性,所以子类中的count也可以通过多态获取,编译时父类中有count,所以可以访问,只是不能访问子类中添加的属性和方法
System.out.println(b == s);
System.out.println(b.count);
b.display();
} }
如果是person类,说明他只是person类的子类,只输出一个
如果是graduate的话,他是三个类的子类
package classTest3;
import java.lang.reflect.Method;
/**
* describe:
*
* @author suoliang
* @create 2021-06-1:28
*/
public class test7 {
public void method(Person2 per){
if (per instanceof Graduate2){
System.out.println("a Graduate");
}
if (per instanceof Student2){
System.out.println("a student");
}
if (per instanceof Person2){
System.out.println("a Person");
}
}
public static void main(String[] args) {
test7 test7 = new test7();
test7.method(new Student2());
}
}
class Person2 {
protected String name="person";
protected int age=50;
public String getInfo() {
return "Name: "+ name + "\n" +"age: "+ age;}
}
class Student2 extends Person2 {
protected String school="pku";
public String getInfo() {
return "Name: "+ name + "\nage: "+ age
+ "\nschool: "+ school;
} }
class Graduate2 extends Student2{
public String major="IT";
public String getInfo()
{ return "Name: "+ name + "\nage: "+ age
+ "\nschool: "+ school+"\nmajor:"+major;
} }
随机的三个子类,发现每次多态结果都不一样
5.7Object类的使用
package classTest3;
import java.util.Objects;
/**
* describe:
*
* @author suoliang
* @create 2021-06-1:47
*/
public class test8 {
public static void main(String[] args) {
Order order = new Order(14,"23");
Order order1 = new Order(14,"23");
System.out.println(order.equals(order1));
}
}
class Order{
int orderId;
String orderName;
public int getOrderId() {
return orderId;
}
public String getOrderName() {
return orderName;
}
public void setOrderId(int orderId) {
this.orderId = orderId;
}
public void setOrderName(String orderName) {
this.orderName = orderName;
}
public Order(int orderId, String orderName) {
this.orderId = orderId;
this.orderName = orderName;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Order order = (Order) o;
return orderId == order.orderId &&
Objects.equals(orderName, order.orderName);
}
}
toString()方法在Object类中定义,其返回值是String类型,返回类名和它的引用地址
public void test() {
char[] arr = new char[] { 'a', 'b', 'c' };
System.out.println(arr);//
int[] arr1 = new int[] { 1, 2, 3 };
System.out.println(arr1);//
double[] arr2 = new double[] { 1.1, 2.2, 3.3 };
System.out.println(arr2);//
}
char重写了print
public void println(char x[]) {
synchronized (this) {
print(x);
newLine();
}
}
package classTest3;
/**
* describe:
*
* @author suoliang
* @create 2021-06-1:59
*/
public class test10 {
p
ublic static void main(String[] args) {
Circle1 circle1 = new Circle1("ds0",45,45);
Circle1 circle2 = new Circle1(45);
System.out.println(circle1.equals(circle2));
}
}
class GeometricObject{
protected String color;
protected double weight;
public GeometricObject() {
this.color = "weight";
this.weight = 1.0;
}
public GeometricObject(String color, double weight) {
this.color = color;
this.weight = weight;
}
public String getColor() {
return color;
}
public double getWeight() {
return weight;
}
public void setColor(String color) {
this.color = color;
}
public void setWeight(double weight) {
this.weight = weight;
}
}
class Circle1 extends GeometricObject{
private double radius;
public Circle1() {
}
public Circle1(double radius) {
this.radius = radius;
}
public Circle1(String color, double weight, double radius) {
super(color, weight);
this.radius = radius;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
@Override
public boolean equals(Object obj) {
if (obj == this){return true;}
if (obj == null || this.getClass() != obj.getClass()){
return false;
}
Circle1 circle1 = (Circle1) obj;
return this.radius == circle1.radius;
}
}
5.8包装类
会有不同,三元运算符会自动转型,变为double
public void method1() {
Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.println(i == j);//false
Integer m = 1;
Integer n = 1;
System.out.println(m == n);//true:在-127-127有一个存储
Integer x = 128;
Integer y = 128;
System.out.println(x == y);//false
}
package classTest3;
import java.util.Scanner;
import java.util.Vector;
/**
* describe:
*
* @author suoliang
* @create 2021-06-2:14
*/
public class test11 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Vector vector = new Vector();
boolean isFlag = true;
while (isFlag){
System.out.println("请输入学生的成绩");
int num = scanner.nextInt();
if (num >= 0){ vector.addElement(new Integer(num));}
else {isFlag = false;}
}
int max = 0;
for (int i = 0; i < vector.size(); i++){
if ((int)vector.elementAt(i) > max){
max = (int)vector.elementAt(i);
}
}
for (int i = 0; i < vector.size(); i++){
if (max - (int)vector.elementAt(i) < 10){
System.out.println("student" + i + " is A");
}else if (max - (int)vector.elementAt(i) < 20){
System.out.println("student" + i + " is B");
}else if (max - (int)vector.elementAt(i) < 80){
System.out.println("student" + i + " is S");
}
}
}
}