Java语言基础(13)

1 继承(二)

  案例:Demo1

public class Demo1 {
  public static void main(String[] args) {
	Bmw bmw = new Bmw();
	bmw.name = "宝马";
	bmw.no = "555555";
	bmw.type = "豪华版";
	bmw.price = 200000.1;
	bmw.color = "白色";
	bmw.show();
	bmw.start();
	bmw.run();
	bmw.stop();
  }
}
class Car{//父类
//属性
  String name;
  String no;
  int speed = 0;
  String color;
//方法
  void start(){
	speed = 100;
	System.out.println(name+"启动了");
  }
  void run(){
	System.out.println(name+"在行驶,当前"+
			"的速度是"+speed);  
  }
  void stop(){
	speed = 0;
	System.out.println(name+"刹车了,当前"+
			"的速度是"+speed);
  }
}
//编写一个Car类(父类)
//属性:车名,车牌,速度(int speed=0),颜色
//方法:void start():启动,speed=100,输出启动了
//void run():行驶,输出车名以及当前的速度
//void stop():刹车,speed=0,输出车名以及当前速度
class Bmw extends Car{
//属性
  double price;
  String type;
//方法	
  void show(){
	System.out.println(name+","+no+","
			+speed+","+color+","+price
			+","+type);  
  }
}

2 变量的隐藏(属性的覆盖)

  子类编写的属性的名字跟父类中继承过来的属性名一致,子类编写的属性会覆盖从父类中继承过来的属性。
  案例:Demo2

public class Demo2 {
  public static void main(String[] args) {
	Foo2 foo = new Foo2();
	System.out.println(foo.name);
  }
}
class Foo1{
  String name = "卫青";	
}
class Foo2 extends Foo1{
  String name = "霍去病";  	
}

public class Demo3 {
  public static void main(String[] args) {
	Eoo2 eoo = new Eoo2();
	System.out.println(eoo.num1);//true
  }
}
class Eoo1{
  int num1 = 100;	
}
class Eoo2 extends Eoo1{
  boolean num1 = true;	
//变量的隐藏只看子类和父类中的属性的名字是否一致,
//跟类型无关。  
}

  变量的隐藏跟属性的类型无关,只要子类编写的属性的名字跟父类中继承过来的属性名一致,就覆盖了。

3 方法重写(方法覆盖)

  子类编写的方法覆盖了从父类中继承过来的方法。
  1) 方法重写要求子类编写的方法的名字和参数,必须跟要覆盖父类中的方法的名字和参数一致。
  2) 参数一致:参数的类型和个数一致,跟参数的名字无关。
    案例:Demo4

public class Demo4 {
  public static void main(String[] args) {
	Koo2 koo = new Koo2();
	koo.f1();
  }
}
class Koo1{
  void f1(){
	System.out.println("今天天气很好");
	System.out.println("父类Koo1中编写的方法");
  }	
}
class Koo2 extends Koo1{
  void f1(){
	System.out.println("子类Koo2中重写" +
			"父类Koo1中的方法f1()");  
  }	
}

public class Demo5 {
  public static void main(String[] args) {
	User1 user = new User1();
	user.name = "张三";
	user.age = 26;
	user.job = "经理";
	user.address = "北京";
	user.email = "san@126.com";
	user.salary = 30000.1;
	user.show();
  }
}
class Person1{//父类
//属性
  String name;
  int age;
  String job;
  double salary;
//方法	
  void show(){
	System.out.println(name+","+age+","
			+job+","+salary);  
  }
}
//设计一个Person1(父类)
//属性:姓名,年龄,职位,工资
//方法:void show():输出每一个属性的值
class User1 extends Person1{
//属性
  String address;
  String email;
//方法	
  void show(){
	System.out.println(name+","+age+","
			+job+","+salary+","+address
			+","+email);  
  }
}

public class Demo6 {
  public static void main(String[] args) {
	Zoo2 zoo = new Zoo2();
	zoo.f1(100,200);
  }
} 
class Zoo1{
  void f1(int a,int b){
	int sum = a + b;
	System.out.println("sum="+sum);
	System.out.println("父类Koo1中的方法" +
			"f1()");
  }	
}
class Zoo2 extends Zoo1{
  void f1(int num1,int num2){
	int result = num1 * num2;
	System.out.println("result="+result);
	System.out.println("子类Zoo2中的方法" +
			"f1()重写父类Zoo1中的方法f1()");
  }	
}

  3) 方法重写跟方法重载的区别?
    a) 方法重写在子类和父类之间,子类编写的方法覆盖了从父类中继承过来的方法。方法重载在一个类的内部,方法名相同,参数不同的多个方法。
    b) 方法重写要求子类和父类中要重写方法的名字和参数一致。参数一致,参数的类型和个数一致,跟参数的名字无关。方法重载中要求重载的多个方法的名字一致,参数要不同,参数不同,参数的类型或者个数不同,跟参数的名字无关。
    c) 方法重写的目的,使用子类重新编写的方法来覆盖从父类中继承过来的方法。方法重载是把功能相似的方法起同一个名字,用户只需要记住一个名字,就可以调用多个方法,减少用户的记忆量,方便方法的使用。


4 继承中的构造方法

  子类可以继承父类的属性和方法,但是不能继承父类中的构造方法,可以在子类的构造方法中,调用父类中的构造方法。
  1)如果父类中没有空参(没有参数)构造方法,则子类必须在自己的构造方法的第1行,使用super(参数)来调用父类中的带参数的构造方法。
    super(参数):在子类构造方法的第1行使用,调用父类中带参数的构造方法。
    案例:Demo7

public class Demo7 {
  
}
class Noo1{
//属性
  String name;
  int age;
  double salary;
//构造方法	
  Noo1(String name,int age,double salary){
	this.name = name;
	this.age = age;
	this.salary = salary;
  }  
}
class Noo2 extends Noo1{
//属性	
  String address;
  String phone;
//构造方法
  Noo2(String name,int age,double salary,
		  String address,String phone){
//super(参数):在子类构造方法第1行使用,调用父类
//中带参数的构造方法
	super(name,age,salary);
	this.address = address;
	this.phone = phone;
  }
}

public class Demo8 {
  public static void main(String[] args) {
	User2 user = 
		new User2("徐达",36,"将军",
		  "漠北",2000000.1,"da@126.com");
    user.showAll();
  }
}
class Person2{
//属性
  String name;
  int age;
  String job;
  String address;
//构造方法
  Person2(String name,int age,String job,
		  String address){
	this.name = name;
	this.age = age;
	this.job = job;
	this.address = address;
  }	
//方法	
  void show(){
	System.out.println(name+","+age+","
			+job+","+address);  
  }
}
class User2 extends Person2{
//属性
  double salary;
  String email;
//构造方法
  User2(String name,int age,String job,
		  String address,double salary,
		  String email){
	super(name,age,job,address);
	this.salary = salary;
	this.email = email;
  }	
//方法
  void showAll(){
	this.show();
	System.out.println("工资:"+salary);
	System.out.println("邮箱:"+email);
  }
}

  2)如果父类中含有空参的构造方法,则子类根据需要任何编写自己的构造方法,而不需要强制使用super(参数)来调用父类中的构造方法。
    案例:Demo9

public class Demo9 {

}
class Moo1{
//属性
  String name;
  int age;
  String job;
  String address;
//构造方法	
  Moo1(String name,int age,String job,
		  String address){
	this.name = name;
	this.age = age;
	this.job = job;
	this.address = address;
  }
  Moo1(){
	  
  }
}
class Moo2 extends Moo1{
//属性
  String phone;
  double comm;
//构造方法	
  Moo2(String name,int age,String job,
		  String address,String phone,
		  double comm){
/*	  
	this.name = name;
	this.age = age;
	this.job = job;
	this.address = address;
*/
	super(name,age,job,address);
	this.phone = phone;
	this.comm = comm;
  }
}

public class Demo10 {
  public static void main(String[] args) {
	Midea midea = 
		new Midea("美的","壁挂式",
			  27,"黑色",5000.22);
	midea.show();
	midea.hot(3);
	midea.cool(8);
  }
}
class Kongtiao{
//属性
  String name;
  String type;
  int degree;
  String color;
//构造方法
  Kongtiao(String name,String type,
		  int degree,String color){
	this.name = name;
	this.type = type;
	this.degree = degree;
	this.color = color;
  }	
  Kongtiao(){
	  
  }
//方法
  void show(){
	System.out.println(name+","+type+","
			+degree+","+color);  
  }
  void hot(int degree){
	this.degree = this.degree + degree;
	System.out.println(name+"升高了"+degree
		+"度以后,当前的温度是"+this.degree);
  }
  void cool(int degree){
	this.degree = this.degree - degree;
	System.out.println(name+"降低了"+degree
		+"度以后,当前的温度是"+this.degree);
  }
}
//设计一个Kongtiao类(父类)
//属性:名称,类型,温度(int degree),颜色
//构造方法:1)给每一个属性赋值  2)空参的构造方法
//方法:void show():输出名称,类型,温度,颜色
//void hot(int degree):升高degree度
//this.degree = this.degree+degree
//void cool(int degree):降低degree度
class Midea extends Kongtiao{
//属性
  double price;
//构造方法
  Midea(String name,String type,
		  int degree,String color,
		  double price){
	super(name,type,degree,color);
	this.price = price;
  }	
//方法	
  void show(){
	System.out.println(name+","+type+","
			+degree+","+color+","+price);  
  }
}

  3)在企业中,一般都建议在父类中编写一个空参的构造方法,方便子类构造方法的编写。
    案例:Demo11

public class Demo11 {
  public static void main(String[] args) {
	Worker worker = 
		new Worker("韦一笑",32,"侠客",
		  2000.1,"光明顶","xiao@126.com");
    worker.show();
    worker.showAll();
    worker.showYearSal();
    Manager manager = 
    	new Manager("任我行",45,"教主",
    	 2001.1,10000000.1,"1333333333");
    manager.show();
    manager.showYearSal();
  }
}
class Emp{
//属性:姓名,年龄,职位,工资
  String name;
  int age;
  String job;
  double salary;
//构造方法
  Emp(String name,int age,String job,
		  double salary){
	this.name = name;
	this.age = age;
	this.job = job;
	this.salary = salary;
  }	
  Emp(){
	  
  }
//方法
  void show(){
	System.out.println(name+","+age+","
			+job+","+salary);  
  }
  void showYearSal(){
	double result = salary * 12;
	System.out.println(name+"的年薪是"+
			result);
  }
}
class Worker extends Emp{
//属性:姓名,年龄,职位,工资,地址,邮箱
  String address;
  String email;	
//构造方法
  Worker(String name,int age,String job,
		  double salary,String address,
		  String email){
	super(name,age,job,salary);
	this.address = address;
	this.email = email;
  }	
//方法	
  void showAll(){
	this.show();
	System.out.println("地址:"+address);
	System.out.println("邮箱:"+email);
  }
}
class Manager extends Emp{
//属性:姓名,年龄,职位,工资,奖金,电话
  double comm;
  String phone;
//构造方法:
  Manager(String name,int age,String job,
		  double salary,double comm,
		  String phone){
	super(name,age,job,salary);  
	this.comm = comm;
	this.phone = phone;
  }//方法:
  void show(){
	System.out.println(name+","+age+","
			+job+","+salary+","+comm+
			","+phone);  
  }
  void showYearSal(){
	double result = salary*12+comm;
	System.out.println(name+"年薪是"+result);
  }
}

    综合案例:
      设计一个Emp类(父类)
      属性:姓名,年龄,职位,工资
      构造方法:1)给每一个属性赋值 2)空参的构造方法
      方法:void show():输出姓名,年龄,职位,工资
        void showYearSal(): 输出姓名和年薪(工资*12)
      编写一个Worker类(子类),继承Emp
      属性:姓名,年龄,职位,工资,地址,邮箱
      构造方法:给所有属性赋值
      方法:void showAll():输出每一个属性值
        void showYearSal():输出姓名和年薪(工资*12)
      编写一个Manager类(子类),继承Emp
      属性:姓名,年龄,职位,工资,奖金,电话
      构造方法:给每一个属性赋值
      方法:void show():输出每一个属性值
        void showYearSal():输出姓名和年薪(工资*12+奖金)
      在main中,分别创建Worker和Manager对象,调用其方法


5 访问控制修饰符(一)
  1)public:公共的,可以用来修饰类,属性,构造方法,以及方法,被public修饰类,属性,构造方法以及方法,可以任意进行访问。
    案例:Demo12

public class Demo12 {
  public static void main(String[] args) {
	Coo coo1 = new Coo();
	System.out.println(coo1.name);
  }
}
class Coo{
  public String name = "张辽";	
}

  2)private:私有,可以用来修饰属性,构造方法以及方法,被privae修饰属性,构造方法以及方法,只能在本类的内部访问,外界无法访问。
    案例:Demo13

public class Demo13 {
  public static void main(String[] args) {
	Yoo yoo = new Yoo();
	System.out.println(yoo.name);
//	System.out.println(yoo.age);
//被private修饰的属性,只能在本类的内部访问,外界
//无法访问
	yoo.showAge();
  }
}
class Yoo{
  public String name = "张三";
  private int age = 21;
  public void showAge(){
	System.out.println("age="+age); 
  }
}
原文地址:https://www.cnblogs.com/KalosOwen/p/8414528.html