`

java封装继承多态等

阅读更多

       最近一段时间看了很多的视频却忘记总结了,现在只能想到什么写什么了,希望能起到一个回忆巩固的作用。

    1、final关键字

      译为:最终的

         final修饰的数据类型的量都是不能改变的

        final修饰的类是不能被继承的

        final修饰的方法在子类中是不能被重写的

package cn.bjsxt.oop.testFinal;


public /*final*/ class Animal {    //final修饰类则说明,这个类不能被继承!
	
	public /*final*/ void run(){   //final加到方法前面,意味着该方法不能被子类重写!
		System.out.println("跑跑!");
	}

}


class Bird  extends Animal {
	
	public void run(){
		super.run();
		System.out.println("我是一个小小小小鸟,飞呀飞不高");
	}
	
}

package cn.bjsxt.oop.testFinal;

public class TestFinal {
	public static void main(String[] args) {
		final int MAX_VALUE= 200;    //常量。
		double d = Math.PI;
	}
}

 

 

2、隐式参数this

java类里面的方法都有两个隐藏的参数分别是super和this,分别表示直接父类和自己类的对象。默认就加入进去了,不需要手动添加

 

package cn.bjsxt.oop.testThis;

public class Student {
	 String name;
	 int id;   
	 
	 public  Student(String name,int id){
		 this(name);   //通过this调用其他构造方法,必须位于第一句! Constructor call must be the first statement in a constructor
		 this.name = name;
		 this.id = id;
	 }
	 
//本来是这样	 public Student(String name,Student this,Object super){
		 this.name = name;
	 }
	 public Student(){
		 System.out.println("构造一个对象");
	 }
	 
	 public void setName(String name){
		 this.name = name;
	 }
	 
	 
	 public void study(){
		 this.name=  "张三";
		 System.out.println(name+"在學習");
	 }
	 
	 public void sayHello(String sname){
		 System.out.println(name+"向"+sname+"說:你好!");
	 }
	
}



 3、Object类,Object是所有类的父类,默认就继承这个类

 

package cn.bjsxt.oop.testObject;

//不重写Object类的toString方法时,我们打印对象会
直接输出hash码,重写之后就返回这个字符串
public class Mobile {
	public String toString(){
		return "我是一部移动电话";
	}
}
package cn.bjsxt.oop.testObject;

public class TestObject {
	public static void main(String[] args) {
		Object obj = new Object();
		Object obj2 = new Object();
		System.out.println(obj.toString());
		System.out.println(obj2.toString());
		System.out.println(obj==obj2);
		System.out.println(obj.equals(obj2)); 
		
		
		Mobile m = new Mobile();
		System.out.println(m.toString()); 
		
	}
}

 输出:java.lang.Object@64ea66
java.lang.Object@158f9d3
false
false

我是一部移动电话

 

静态

 

package cn.bjsxt.oop.testStatic;

public class Student {
	 String name;
	 int id;   
	 
	 static  int  ss;
	 
	 public static void printSS(){
		 System.out.println(ss);
	 }
	 

	 public void study(){
		 printSS();
		 System.out.println(name+"在學習");
	 }
	 
	 public void sayHello(String sname){
		 System.out.println(name+"向"+sname+"說:你好!");
	 }
	
}



package cn.bjsxt.oop.testStatic;

public class Test {
	public static void main(String[] args) {
		Student.ss = 323;
		Student.printSS();
		
		Student s1 = new Student();
		
	}
}

 

静态代码块

package cn.bjsxt.oop.staticInitBlock;

public class Parent001 /*extends Object*/ {
	static int aa;
	static {
		System.out.println(" 静态初始化Parent001");
		aa=200;
	}
}

package cn.bjsxt.oop.staticInitBlock;

public class TestStaticInitBlock extends Parent001 {
	
	static int a ;
	
	static {
		System.out.println("静态初始化TestStaticInitBlock!");
		a = 100;
	}
	
	
	public static void main(String[] args) {
		
	}
}

  静态初始化Parent001
静态初始化TestStaticInitBlock!

 

封装encapsulation,记忆capsul,胶囊

比如把属性设为私有,同时提供共有的方法访问或者设置属性值

 

继承与组合

继承:isa

package cn.bjsxt.oop.inherit;

/**
 * 测试继承
 * @author dell
 *
 */
public class Animal /*extends Object*/ {
	String eye;
	
	public void run(){
		System.out.println("跑跑!");
	}
	public void eat(){
		System.out.println("吃吃!");
	}
	public void sleep(){
		System.out.println("zzzzz");
	}
	
	public  Animal(){
		super();
		System.out.println("创建一个动物!");
	}
	
}

class Mammal extends Animal {
	
	public void taisheng(){
		System.out.println("我是胎生");
	}
	
}

class Bird  extends Animal {
	public void run(){
		super.run();
		System.out.println("我是一个小小小小鸟,飞呀飞不高");
	}
	
	public void eggSheng(){
		System.out.println("卵生");
	}
	
	public Bird(){
		super();
		System.out.println("建一个鸟对象");
	}
	
}

 

 

组合:hasa

package cn.bjsxt.oop.inherit;

/**
 * 测试组合
 * @author dell
 *
 */
public class Animal2 {
	String eye;
	
	public void run(){
		System.out.println("跑跑!");
	}
	public void eat(){
		System.out.println("吃吃!");
	}
	public void sleep(){
		System.out.println("zzzzz");
	}
	
	public  Animal2(){
		super();
		System.out.println("创建一个动物!");
	}
	
	public static void main(String[] args) {
		Bird2 b = new Bird2();
		b.run();
		b.animal2.eat();
	}
	
}

class Mammal2  {
	Animal2 animal2=new Animal2();
	public void taisheng(){
		System.out.println("我是胎生");
	}
	
}

class Bird2  {
	Animal2 animal2=new Animal2();
	
	public void run(){
		animal2.run();
		System.out.println("我是一个小小小小鸟,飞呀飞不高");
	}
	
	public void eggSheng(){
		System.out.println("卵生");
	}
	
	public Bird2(){
		super();
		System.out.println("建一个鸟对象");
	}
	
}

 

 

继承时带来的强制类型转换,和基本数据类型一样,引用数据类型也会有类型的转化

package cn.bjsxt.oop.polymorphism;

public class Animal {
	String str;
	public void voice(){
		System.out.println("普通动物叫声!");
	}
}

class Cat extends Animal {
	public void voice(){
		System.out.println("喵喵喵");
	}
	public void catchMouse(){
		System.out.println("抓老鼠");
	}
}

class Dog extends Animal {
	public void voice(){
		System.out.println("汪汪汪");
	}
	
	public void seeDoor(){
		System.out.println("看门!");
	}
	
}

class Tiger extends Animal {
	public void voice(){
		System.out.println("哇哇哇");
	}

	
}

class Pig extends Animal {
	public void voice(){
		System.out.println("哼哼哼");
	}
}

 动物都会发声,重写voice方法,不同的动物有不同的发声方法。有的动物还有自己父类所不具备的方法,猫会抓老鼠,狗会看门。

 

package cn.itcast_04;

public class Test {
	
	public static void testAnimalVoice(Animal c){
		c.voice();
		if(c instanceof Cat){
			((Cat) c).catchMouse();
		}
	}
	
	 
	public static void testAnimalVoice(Dog c){
		c.voice();
	}
	
	public static void testAnimalVoice(Pig c){
		c.voice();
	} 
 
	public static void main(String[] args) {
		//父类的引用指向子类的对象
              Animal a = new Cat();
                //强制类型转化,低到高
		Cat a2 = (Cat)a;
                //a是Cat实例的引用,会调用捉老鼠的方法
		testAnimalVoice(a);

                / /完成了强制类型转化
      	        a2.catchMouse();

 		Animal b = new Dog();
 		Animal c = new Tiger();
 		testAnimalVoice(b);
 	testAnimalVoice(c);
		
	}
}

 要考虑编译(eclipse不带有红叉报错)和运行阶段的错误(不抛出异常,比如ClassCastException)

代码改成:

 Animal a = new Animal();
                //强制类型转化,低到高
Cat a2 = (Cat)a;
则:抛出

cn.itcast_04.Animal cannot be cast to cn.itcast_04.Cat。

父类不可以强制转换为子类,因为子类有的方法父类可能没有

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics