五.面向对象(三)

转载自:Java笔记目录

3.1 main()方法

由于java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public,又因为java虚拟机在执行main()方法时不必创建对象,所以该方法必须是static的,该方法接收一个String类型的数组参数,该数组中保存执行java命令时传递给所运行的类的参数。

public static void main(String[] args){

     //方法体    

}

①main()是一个方法,是主方法,为程序的入口

②权限修饰符:public protected 缺省 private ---面向对象的封装性

③对于方法来讲:static final abstract

④方法的返回值:void /  具体的返回值类型(基本的数据类型 & 引用数据类型),方法内部一定要有return

⑤方法名:命名的规则:xxxYyyZzz。给方法命名时,要见名之意

⑥形参列表:同一个方法名不同的形参列表的诸多个方法间构成重载。   形参 & 实参---方法的参数传递机制:值传递

⑦方法体:方法定义的是一种功能,具体的实现由方法体操作。

 

3.2类的成员之四:代码块

①初始化块(代码块)作用:Java对象进行初始化

②程序的执行顺序:

 

 

③一个类中初始化块若有修饰符,则只能被static修饰,称为静态代码块(static block ),当类被载入时,类属性的声明和静态代码块先后顺序被执行,且只被执行一次。

tatic块通常用于初始化static ()属性

class Person {

public static int total;

static {

        total = 100;//total赋初值

}

…… //其它属性或方法声明

}

⑤非静态代码块:

1)可以对类的属性(静态的 & 非静态的)进行初始化操作,同时也可以调用本类声明的方法(静态的 & 非静态的)

2)里面可以有输出语句

3)一个类中可以有多个非静态的代码块,多个代码块之间按照顺序结构执行

4)每创建一个类的对象,非静态代码块就加载一次。

5)非静态代码块的执行要早于构造器

⑥静态代码块:

1)里面可以有输出语句

2)随着类的加载而加载,而且只被加载一次

3)多个静态代码块之间按照顺序结构执行

4)静态代码块的执行要早于非静态代码块的执行。

5)静态的代码块中只能执行静态的结构(类属性,类方法)

 

 

⑦关于属性赋值的操作:

1)默认的初始化

2)显式的初始化或代码块初始化(此处两个结构按照顺序执行)

3)构造器中;

—————————以上是对象的属性初始化的过程—————————————

4)通过方法对对象的相应属性进行修改

 

3.3 final关键字

3.3.1 final的定义

在Java中声明类、属性和方法时,可使用关键字final来修饰,表示“最终”。

final标记的类不能被继承。提高安全性,提高程序的可读性。

String类、System类、StringBuffer类

final标记的方法不能被子类重写。

Object类中的getClass()。

final标记的变量(成员变量或局部变量)即称为常量。名称大写,且只能被赋值一次。

final标记的成员变量不能使用默认初始化,必须在声明的同时或在每个构造方法中或代码块中显式赋值,然后才能使用。final double PI=3.14;

变量用static final修饰:全局常量。比如:Math 类的PI。

④要与finally finalize()区分开。

3.3.2 final基础语法

final修饰类

final class A{

}

class B extends A{     //错误,不能被继承。

}

中国古代,什么人不能有后代,就可以被final声明,称为太监类

final修饰方法

class A{

       public final void print(){

                System.out.println(“A”);

       }

}

class B extends A{    

        public void print(){   //错误,不能被重写。

                  System.out.println(“尚硅谷”);

         }

}

final修饰变量——常量

class  A{

        private final String INFO = “atguigu”;  //声明常量

        public void print(){

                  //INFO = “尚硅谷”;

         }

}

常量名要大写,内容不可修改。——如同古代皇帝的圣旨。

 

final修饰的成员变量:一般和static联用。

class MyMath{

       //常量.java规范中要求所有的常量“大写”

       //常量:值不可再改变的变量.

       public static final double PI = 3.14;

}

⑤关键字final应用举例:

public final class Test{

              public static int totalNumber = 5 ;

              public final int ID;

              public Test(){

                     ID = ++totalNumber;  //可在构造方法中给final变量赋值

              }

            public static void main(String[] args) {

                     Test t = new Test();

                     System.out.println(t.ID);             

                     final int I = 10;

                     final int J;

                     J = 20;

                     J = 30;  //非法

                  }

}

 

 

⑥深入final

final修饰的引用类型,该引用不可再重新指向其他的java对象。但是fianl修饰的引用,该引用指向的对象的属性是可以修改的。

public class Test02{

       public static void main(String[] args){

              final Customer c = new Customer("JACK",15);

              //c是final的,无法重新赋值。

              //c = new Customer("LUCY",20);//Error

              c.name = "李四";

              c.age = 25;

              System.out.println(c.name);

              System.out.println(c.age);

       }

}

class Customer{

       String name;

       int age;

       Customer(String name,int age){

              this.name = name;

              this.age = age;

       }

}

 

3.4抽象:abstract

3.4.1什么是抽象类?

随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类。

 

 

3.4.2抽象类基础语法

①用abstract关键字来修饰一个类时,这个类叫做抽象类;用abstract来修饰一个方法时,该方法叫做抽象方法。

②如何定义抽象类?

class关键字前加abstract。不能用abstract修饰属性、私有方法、构造器、静态方法、final的方法。

③抽象类无法被实例化。抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。若没有重写全部的抽象方法,仍为抽象类。

④虽然抽象类没有办法实例化,但是抽象类也有构造方法,该构造方法是给子类创建对象用的。

⑤抽象类中可以定义抽象方法.

抽象方法的语法:只有方法的声明,没有方法的实现。在方法的修饰符列表中添加abstract关键字.并且抽象方法应该以“;”结束,不能带有“{}”。例如:public abstract void m1();

⑥抽象类中不一定有抽象方法,但抽象方法必须出现在抽象类中。含有抽象方法的类必须被声明为抽象类。

⑦一个非抽象的类继承抽象类,必须将抽象类中的抽象方法覆盖,实现,重写。

⑧抽象类不能被final修饰,抽象方法不能被final修饰。

3.4.3抽象类举例

abstract class A{  

       abstract void m1( );

       public void m2( ){

           System.out.println("A类中定义的m2方法");

       }

}

class B extends A{

       void m1( ){

            System.out.println("B类中定义的m1方法");

       }

}

public class Test{

       public static void main( String args[ ] ){

            A a = new B( );

            a.m1( );

            a.m2( );

       }

}

3.4.4思考

①为什么抽象类不可以使用final关键字声明?

abstract类一定要能被继承,而final类不能被继承

②一个抽象类中可以定义构造器吗?

//abstract 不能用来修饰属性、构造器、private、final、static

public class TestAbstract1 {

      

}

abstract class A1{

       //abstract int name;

       //因为构造器不能被重写

//     public abstract A1(){

//     }

       //子类不能覆盖(或重写)声明为private的方法的。

       //private abstract void method1();

       // final修饰的方法不能重写      

//     public abstract final void method2();

//     public abstract static void method3();

//     static修饰的方法可以用类来调,但是abstract 的方法又没有方法体。。。

}

注意:

1)当我们设计一个类,不需要创建此类的实例时候,就可以考虑将其设置为抽象的,由其子类实现这个类的抽象方法以后,就行实例化。

2)抽象方法只保留方法的功能,而具体的执行,交给继承抽象类的子类,由子类重写此抽象方法。

3)若子类继承抽象类,并重写了所有的抽象方法,则此类是一个"实体类",即可以实例化。

4)若子类继承抽象类,没有重写所有的抽象方法,意味着此类中仍有抽象方法,则此类必须声明为抽象的!

③模板方法设计模式       

抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式。

解决的问题

当功能内部一部分实现是确定,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。

编写一个抽象父类,父类提供了多个子类的通用方法,并把一个或多个方法留给其子类实现,就是一种模板模式。

public class TestTemplate {

       public static void main(String[] args) {

              new SubTemplate().spendTime();

       }

}

abstract class Template {

       public abstract void code();

       public void spendTime() {

              long start = System.currentTimeMillis();

              this.code();

              long end = System.currentTimeMillis();

              System.out.println("花费的时间为:" + (end - start));

       }

}

class SubTemplate extends Template {

       public void code() {

              boolean flag = false;

              for(int i = 2;i <= 10000;i++){

                     for(int j = 2;j <= Math.sqrt(i);j++){

                            if(i % j == 0){

                                   flag = true;

                                   break;

                            }

                     }

                     if(!flag){

                            System.out.println(i);

                     }

                     flag = false;

              }

       }

}

 

 

3.5接口interface

①有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是,Java不支持多重继承。有了接口,就可以得到多重继承的效果。

②接口(interface)是抽象方法和常量值的定义的集合。

③从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。

 

 

 

 

3.5.1接口基础语法:

接口也是一种引用类型,可以等同看做类.

①如何定义接口,语法:

[修饰符] interface 接口名{}

②接口中只能出现:常量、抽象方法。

接口中的所有成员变量都默认是由public static final修饰的。

接口中的所有方法都默认是由public abstract修饰的。

③接口其实是一个特殊的抽象类,特殊在接口是完全抽象的。

④接口中没有构造方法,无法被实例化。

⑤接口和接口之间可以多继承。

⑥一个类可以实现多个接口。(这里的“实现”可以等同看做“继承”)

⑦一个非抽象的类实现接口,需要将接口中所有的方法“实现/重写/覆盖”,方可实例化。否则,仍为抽象类。

⑧如果实现接口的类中没有实现接口中的全部方法,必须将此类定义为抽象类

⑨接口的主要用途就是被实现类实现。(面向接口编程)

与继承关系类似,接口与实现类之间存在多态性。

定义Java类的语法格式:先写extends,后写implements

public interface A{

       //常量(必须用public static final修饰)

       public static final String SUCCESS = "success";

       public static final double PI = 3.14;

       byte MAX_VALUE = 127; //常量//public static final是可以省略的。

       //抽象方法(接口中所有的抽象方法都是public abstract)

       public abstract void m1();

       void m2();//public abstract是可以省略的。

}

interface B{

       void m1();

}

interface C{

       void m2();

}

interface D{

       void m3();

}

interface E extends B,C,D{

       void m4();

}

//implements是实现的意思,是一个关键字.

//implements和extends意义相同。

class MyClass implements B,C{

       public void m1(){}

       public void m2(){}

}

class F implements E{

       public void m1(){}

       public void m2(){}

       public void m3(){}

       public void m4(){}

}

 

 

3.5.2接口的作用

①可以使项目分层,所有层都面向接口开发,开发效率提高了。

②接口使代码和代码之间的耦合度降低,就像内存条和主板的关系,变得“可插拔”。可以随意切换。

③接口和抽象类都能完成某个功能,优先选择接口。因为接口可以多实现,多继承。并且一个类除了实现接口之外,还可以去继承其他类(保留了类的继承)。

举例1

public interface CustomerService{

      

       //定义一个退出系统的方法

       void logout();

      

}

/*    编写接口的实现类.

       该类的编写完全是面向接口去实现的。

*/

public class CustomerServiceImpl implements CustomerService{

       //对接口中的抽象方法进行实现。

       public void logout(){

              System.out.println("成功退出系统!");

       }

}

public class Test{

       //入口

       public static void main(String[] args){

              //要执行CustomerServiceImpl中的logout方法.

             

              //以下程序面向接口去调用 

              CustomerService cs = new CustomerServiceImpl(); //多态

              //调用

              cs.logout();

       }

}

 

 

举例2

/*

       汽车和发动机之间的接口。

      

       生产汽车的厂家面向接口生产。

       生产发动机的厂家面向接口生产。

*/

public interface Engine{

      

       //所有的发动机都可以启动.

       void start();

}

//生产汽车

public class Car{

      

       //Field

       //引擎

       //面向接口编程

       Engine e;

      

       //Constructor

       Car(Engine e){

              this.e = e;

       }

      

       //汽车应该能够测试引擎

       public void testEngine(){

              e.start();//面向接口调用

       }

}

public class YAMAHA implements Engine{

       public void start(){

              System.out.println("YAMAHA启动");

       }

}

public class HONDA implements Engine{

       public void start(){

              System.out.println("HONDA启动");

       }

}

public class Test{

      

       public static void main(String[] args){

             

              //1.生产引擎

              YAMAHA e1 = new YAMAHA();

             

              //2.生产汽车

              Car c = new Car(e1);

             

              //3.测试引擎

              c.testEngine();

             

              //换HONDA

              c.e = new HONDA();

             

              c.testEngine();

        }

}

3.5.3接口的应用:工厂方法(FactoryMethod)& 代理模式(Proxy)

①工厂方法(FactoryMethod)

概述

定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。

适用性:

1)当一个类不知道它所必须创建的对象的类的时候

2)当一个类希望由它的子类来指定它所创建的对象的时候

3)当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候

工厂方法举例:

 

 

总结:

FactoryMethod模式是设计模式中应用最为广泛的模式,在面向对象的编程中,对象的创建工作非常简单,对象的创建时机却很重要。FactoryMethod解决的就是这个问题,它通过面向对象的手法,将所要创建的具体对象的创建工作延迟到了子类,从而提供了一种扩展的策略,较好的解决了这种紧耦合的关系。

 

//接口的应用:工厂方法的设计模式

public class TestFactoryMethod {

       public static void main(String[] args) {

              IWorkFactory i = new StudentWorkFactory();

              i.getWork().doWork();

             

              IWorkFactory i1 = new TeacherWorkFactory();

              i1.getWork().doWork();

       }

}

 

interface IWorkFactory{

       Work getWork();

}

class StudentWorkFactory implements IWorkFactory{

 

       @Override

       public Work getWork() {

              return new StudentWork();

       }

      

}

class TeacherWorkFactory implements IWorkFactory{

 

       @Override

       public Work getWork() {

              return new TeacherWork();

       }

      

}

 

interface Work{

       void doWork();

}

class StudentWork implements Work{

       @Override

       public void doWork() {

              System.out.println("学生写作业");

       }

}

class TeacherWork implements Work{

       @Override

       public void doWork() {

              System.out.println("老师批改作业");

       }

}

代理模式(Proxy)

概述:

为其他对象提供一种代理以控制对这个对象的访问。

 

 

 

interface Object{

void action();

}

class ProxyObject implements Object{

Object obj;

public void action(){

System.out.println("代理开始");

obj.action();

System.out.println("代理结束");

}

public ProxyObject(){

System.out.println("这是代理类");

obj = new ObjectImpl();

}

}

class ObjectImpl implements Object{

public void action(){

System.out.println("======");

System.out.println("======");

System.out.println("被代理的类");

System.out.println("======");

System.out.println("======");

}

}

public class Test2 {

public static void main(String[] args) {

Object ob = new ProxyObject();

ob.action();

}

}

//接口的应用:代理模式(静态代理)

public class TestProxy {

       public static void main(String[] args) {

              Object obj = new ProxyObject();

              obj.action();

       }

}

interface Object{

       void action();

}

//代理类

class ProxyObject implements Object{

       Object obj;

       public ProxyObject(){

              System.out.println("代理类创建成功");

              obj = new ObjctImpl();

       }

       public void action(){

              System.out.println("代理类开始执行");

              obj.action();

              System.out.println("代理类执行结束");

       }

}

//被代理类

class ObjctImpl implements Object{

       @Override

       public void action() {

              System.out.println("=====被代理类开始执行======");

              System.out.println("=====具体的操作======");

              System.out.println("=====被代理类执行完毕======");

       }

}

 

3.6 类的成员之五:内部类

3.6.1 静态内部类

①静态内部类可以等同看做静态变量。

②内部类重要的作用:可以访问外部类中私有的数据。

③静态内部类可以直接访问外部类的静态数据,无法直接访问成员。

④静态内部类不会持有外部的类的引用,创建时可以不用创建外部类,静态内部类可以直接访问外部的静态变量,如果访问外部类的成员变量必须通过外部类的实例访问

public class OuterClass{

      

       //静态变量

       private static String s1 = "A";

      

       //成员变量

       private String s2 = "B";

      

       //静态方法

       private static void m1(){

              System.out.println("static's m1 method execute!");

       }

       //成员方法

       private void m2(){

              System.out.println("m2 method execute!");

       }

       //静态内部类

       //可以用访问控制权限的修饰符修饰。

       //public,protected,private,缺省

       static class InnerClass{

              //静态方法

              public static void m3(){

                     System.out.println(s1);

                     m1();

                    

                     //System.out.println(s2);

                     //m2();

              }

              //成员方法

              public void m4(){

                     System.out.println(s1);

                     m1();

                    

                     //System.out.println(s2);

                     //m2();

              }

       }

       //入口

       public static void main(String[] args){

             

              //执行m3

              OuterClass.InnerClass.m3();

             

              //执行m4

              InnerClass inner = new OuterClass.InnerClass();

              inner.m4();

       }

}

3.6.2 成员内部类

①成员内部类可以等同看做成员变量

②成员内部类中不能有静态声明

③成员内部类可以访问外部类所有的数据

public class OuterClass{

       //静态变量

       private static String s1 = "A";

       //成员变量

       private String s2 = "B";

       //静态方法

       private static void m1(){

              System.out.println("static's m1 method execute!");

       }

       //成员方法

       private void m2(){

              System.out.println("m2 method execute!");

       }

       //成员内部类

       //可以用访问控制权限的修饰符修饰。

       //public,protected,private,缺省

       class InnerClass{

              //静态方法

              //public static void m3(){}

              //成员方法

              public void m4(){

                     System.out.println(s1);

                     m1();

                    

                     System.out.println(s2);

                     m2();

              }

       }

       //入口

       public static void main(String[] args){

              //创建外部类对象

              OuterClass oc = new OuterClass();

              InnerClass inner = oc.new InnerClass();

              inner.m4();

       }

}

3.6.3 局部内部类

①局部内部类等同于局部变量

②重点:局部内部类在访问局部变量的时候,局部变量必须使用final修饰

③局部内部类是在方法中定义的,它只能在当前方法中使用。和局部变量的作用一样

局部内部类和成员内部类一致,不能包含静态成员

public class OuterClass{

       //方法

       public void m1(){

       //局部变量

       final int i = 10;//

             

              //局部内部类

              //局部内部类不能用访问控制权限修饰符修饰。

              class InnerClass{

                     //内部类不能有静态声明

                     //public static void m1(){}

                     //成员方法

                     public void m2(){

                            System.out.println(i); // 10

                     }

              }

              //调用m2

              InnerClass inner = new InnerClass();

              inner.m2();

       }

       //入口

       public static void main(String[] args){

              OuterClass oc = new OuterClass();

              oc.m1();

       }

}

3.6.4 匿名内部类

是一种特殊的内部类,该类没有名字

public class Test{

       //静态方法

       public static void t(CustomerService cs){

              cs.logout();

       }

       //入口

       public static void main(String[] args){

              //调用t方法

              //t(new CustomerServiceImpl());

              //使用匿名内部类的方式执行t方法

              //整个这个"new CustomerService(){}"就是个匿名内部类

              t(new CustomerService(){

                     public void logout(){

                            System.out.println("exit!");

                     }

              });

              //匿名内部类的优点:少定义一个类.

              //缺点:无法重复使用!

       }

}

//接口

interface CustomerService{

       //退出系统

       void logout();

}

//编写一个类实现CustomerService接口

/*

class CustomerServiceImpl implements CustomerService{

       public void logout(){

              System.out.println("系统已经安全退出!");

       }

}

*/

 

 

3.7 类之间的关系

3.7.1 泛化关系

 类和类之间的继承关系及接口与接口之间的继承关系。

 

 

 

 

3.7.2 实现关系

类对接口的实现。

 

 

3.7.3 关联关系

类与类之间的连接,一个类可以知道另一个类的属性和方法,在java 语言中使用成员变量体现。

 

 

Me

public class Me{

         String name; //Field

        

         //在当前类中含有其他类的引用。

         //在当前对象中含有指向其他对象的引用。

         //朋友

         Friend f; //Me和Friend就是关联关系

        

         Me(Friend f){

                   this.f = f;

         }

}

Friend

public class Friend{

         //Field

         String name;

         String addr;

         String tel;

         Friend(String addr){

                   this.addr = addr;

         }

}

Test

public class Test{

         public static void main(String[] args){

                   Friend f = new Friend("北京朝阳");

                  

                   //建立关联关系

                   Me m = new Me(f);

                  

                   //通过m可以获取朋友的住址

                   System.out.println(m.f.addr);

         }

}

3.7.4 聚合关系

是关联关系的一种,是较强的关联关系,是整体和部分的关系,如:汽车和轮胎,它与关联关系不同,关联关系的类处在同一个层次上,而聚合关系的类处在不平等的层次上,一个代表整体,一个代表部分,在java 语言中使用实例变量体现。

 

 

Classroom

//ClassRoom就是整体

public class ClassRoom{

 

         //ClassRoom和List集合属于关联关系.在同一个层级上.

         //ClassRoom和Student属于聚合关系,一个是整体,一个是部分.

         List<Student> stus; //Student就是部分.

        

         //聚合关系:整体不依赖部分,部分也不会依赖整体。

         //整体无法决定部分的生命周期。

}

Student

public class Student{

 

}

3.7.4 合成关系

是关联关系的一种,比聚合关系强的关联关系,如:人和四肢,整体对象决定部分对象的生命周期,部分对象每一时刻只与一个对象发生合成关系,在java 语言中使用实例变量体现。

 

 

public class 人{

      

       //人和List是关联关系.

       //人和四肢是合成关系,人是整体,四肢是部分.

       //合成关系和聚合关系是相似的,区别的地方在:整体和部分是紧密相连的

       //整体的生命周期决定部分的生命周期。

       List<四肢> s;

}

四肢

public class 四肢{

 

}

3.7.5 依赖关系

依赖关系是比关联关系弱的关系,在java 语言中体现为返回值,参数,局部变量和静态方法调用。

 

 

Test

public class Test{

         public void m1(){

                  

                   //局部变量

                   User u = new User(); //依赖关系.

         }

        

}

User

class User{

 

 }

3.8 is-a、is-like-a、has-a

3.8.1 is-a(类和类之间的继承关系,泛化关系)

public class Animal{

public void method1() ;

}

public class Dog extends Animal { //Dog is a Animal

}

3.8.2 is-like-a(类对接口的实现,类和接口之间的关系,实现关系)

public interface I {

public void method1() ;

}

public class A implements I { //A is like a I;

public void method1() {

//实现

}

}

3.8.3 has-a(A中包含B,关联关系)

public class A { //A has a B;

private B b;

}

public class B {

}

 

总结:

 

 

面向对象的三条主线:

一、类及类的成分

1.类与类的关系:

java程序是关注于类的设计。

类从代码的角度:并列关系!  

从执行、设计的角度:关联关系、继承关系、聚合关系

class A{

 

}

class B{

   A  a = new A();

}

2.类的成分:属性   方法  构造器  代码块  内部类

2.1 属性:

①变量的分类:成员变量(属性 Field)vs 局部变量(方法的形参、方法内部、代码块内部)

②数据类型:基本数据类型(8种,不同的数据类型对应不同的默认初始化值vs 引用数据类型(数组、类、接口 默认初始化值为null)

③属性的声明格式:修饰符  数据类型  变量名 = 初始化值;//java是强数据类型的语言

④对属性的赋值的操作:默认初始化、显式的初始化、代码块的初始化、构造器的初始化、调用方法或属性进行赋值

2.2 方法  

①格式:修饰符(其它的关键字:static/final/abstract)返回值类型 方法名(形参列表){

//方法体 }

②方法的重载(overload)   vs  方法的重写(override overwrite)

③ 方法的参数传递机制:值传递(难点)

2.3构造器  

①构造器的作用:1.创建类的对象  2.初始化对象的成员变量

②构造器也是可以重载的。

2.4 代码块  

①主要作用:用来初始化类的成员变量

②分类:静态的代码块  vs  非静态的代码块

2.5 内部类  

①分类:成员内部类(static的成员vs 非static的成员)vs 局部内部类(方法内部声明的类)

②掌握 :如何创建成员内部类的对象(如:创建Bird类和Dog类的对象)、如何区分调用外

部类或内部类的变量(尤其是变量重名时)、局部内部类的使用 (见TestInnerClass1.java)

3. 类的初始化(创建类的对象)

3.1 如何创建类的对象。

如: Person p = new Person();  Date d = new Date();

3.2 内存解析:

①栈:局部变量、对象的引用名、数组的引用名

  堆:new 出来的“东西”

  方法区:(字符串常量池)

  静态域:存放类中静态的变量

②如何理解创建的对象在内存中加载的过程(理解)

3.3 子类对象实例化的全过程: SubClass sc = new SubClass();

二、面向对象的三大特性:

1.封装性:

① 通过私有化类的成员变量,通过公共的getter和setter方法来调用和修改

② 还可以对类的其他结构进行“封装”

③ 权限修饰符:public protected 缺省 private

2.继承性:

①通过让一个类A继承另一个类B,就可以获取类B中的结构(主要的:属性、方法、构造器)。子类:类A  父类:类B

②java中的类的继承性:单继承的。

3.多态性:

①体现:方法的重载与重写;子类对象的多态性  Person p = new Student();

②子类对象多态性的使用:虚拟方法调用。

③向上转型  向下转型 Student s = (Student)p; 

//建议在向下转型之前: if ( p instanceof Student)避免出现ClassCastException的异常

三、其它关键字:

1.this:修饰属性、方法、构造器。表示:当前对象或当前正在创建的对象。

2.super:修饰属性、方法、构造器。显式的调用父类的相应的结构,尤其是子父类有重名的方法、属性

3.static :修饰属性、方法、代码块、内部类。随着类的加载而加载!

4.final:修饰类、属性、方法。表示“最终的”

5.abstract:修饰类、方法

6. interface:表示是一个接口,(接口是与类并列的一个结构)。类与接口之间同时“implements”发生关系。

7.package import …

8.abstract:不能修饰属性、构造器、不能与final static private共用。

 

 

 

posted @ 2022-05-11 10:37  mooyoo末鱼  阅读(38)  评论(0)    收藏  举报