首页 > 编程语言 >java三大特性

java三大特性

时间:2022-09-27 12:12:08浏览次数:49  
标签:java 子类 void 特性 Student println 父类 public 三大

java三大特性

封装、继承、多态

封装

关键词:private

该露的露,该藏的藏。

高内聚,低耦合

高内聚:类内部的数据操作细节自己完成,不允许外部干预;

低耦合: 仅暴露少量方法给外部使用。

 

封装(数据的隐藏):应该禁止直接访问一个对象中数据的实际表示,通过操作接口来访问

重点!!! 属性私有,get/set。

private。

package charpter5.Demo05;

public class Application {

   public static void main(String[] args) {
       Student student = new Student();
       //不能用student.name直接操作了,因为属性私有。
       //需要用一些public的get()/set()方法。
       System.out.println(student.getName());
       student.setName("ssl");
       System.out.println(student.getName());

  }
}
package charpter5.Demo05;

//类
public class Student {
   //封装 属性私有,数据隐藏
   //名字
   private String name;
   //学号
   private int id;
   //性别
   private char sex;

   public String getName(){
       return this.name;
  }

   public void setName(String name){
       this.name=name;
  }
   //alt+insert快捷键,可以直接添加get()/set()方法
   //初始化的时候可以加相关的约束。
   public int getId() {
       return id;
  }
}

 

继承

关键词:extends super public protected default private

image-20220927100909090

 

 

 

子类、派生类:是父类(基类)的拓展。

  • object类:所有类的父类。

package charpter5.Demo06;

//在java中,所有的类,都默认直接或者间接继承Object类。
//java中只有单继承,没有多继承。

//父类
public class Person {
   /**四个修饰符
    *     //public 公有变量:类内部、同一个包、子类、任何地方
    *     //protected 保护变量:类内部、同一个包、子类
    *     //default 默认变量:类内部、同一个包
    *     //private 私有变量:类内部 用来封装,一般用在属性上,会开放一些get/set方法来操作属性
    */
   //快捷键 ctrl+H 打开继承树

   //公有实例变量
   public int money =10_000_00;


   public void say(){
       System.out.println("hello,I am a person");
  }
}
package charpter5.Demo06;

//子类 继承父类 就会拥有父类的全部方法。
public class Student extends Person{

}
package charpter5.Demo06;

//子类
public class Teacher extends Person{

}
package charpter5.Demo06;

public class Application {
   public static void main(String[] args) {
       Student student = new Student();
       student.say();  //输出:hello,I am a person
  }
}
  • super关键词: 访问父类的属性和方法 super. 私有的不能访问。

创建对象的时候,先调用父类的构造器,再调用子类的构造器。 子类的构造器内默认第一行有super()(父类的无参构造器)。

注意点:

  1. super调用父类的构造方法,必须在构造方法的第一个。

  2. super必须只能出现在子类的方法或者构造方法中。

  3. super和this 不能同时调用构造方法!因为都要求在第一行。

super VS this:

代表的对象不同:

this:本身调用者这个对象

super:父类对象的应用

前提:

this:没有继承也可以使用

super:只能在继承条件才可以使用

构造方法:

this:本类的构造

super:父类的构造

package charpter5.Demo06;

//父类
public class Person {

   protected String name = "ssl_Person";

   public void print(){
       System.out.println("Person");
  }

   public Person(){
       System.out.println("Person构造");
  }

}
package charpter5.Demo06;

//子类 继承父类 就会拥有父类的全部方法。
public class Student extends Person{

   private String name = "ssl_Student";

   //super 用来访问父类的属性和方法
   public void test(String name){
       System.out.println(name);
       System.out.println(this.name);
       System.out.println(super.name);
       /**
        * ssl_Application
        * ssl_Student
        * ssl_Person
        */
  }

   public void print(){
       System.out.println("Student");
  }

   public void test(){
       print();          //相当于用this.
       this.print();
       super.print();
       /**
        * Student
        * Student
        * Person
        */
  }

   public Student(){
       System.out.println("Student构造");
  }

}
package charpter5.Demo06;

public class Application {
   public static void main(String[] args) {
       Student student = new Student();
       /**
        * Person构造
        * Student构造
        */
       student.test("ssl_Application");
       student.test();
  }
}
  • 方法重写 -----重写的都是非静态方法,与属性无关。关键词不能为private 需要有继承关系

  1. 方法名必须相同

  2. 参数列表必须相同

  3. 修饰符:范围可以扩大;但不能缩小。

  4. 抛出的异常:范围可以缩小,但不能扩大。

package charpter5.Demo07;

//父类
public class B {
   public static void test(){
       System.out.println("B_static");
  }

   public void test2(){
       System.out.println("B");
  }
}
package charpter5.Demo07;

//子类
public class A extends B{
   public static void test(){
       System.out.println("A_static");
  }

   public void test2(){
       System.out.println("A");
  }
}
package charpter5.Demo07;

//重写都是非静态方法 与属性无关
public class App {
   public static void main(String[] args) {
       A a = new A();
       a.test();    //输出:A_static

       //方法的调用只和左边的类型有关。
       //父类的引用指向了A
       B b = new A();
       b.test();    //输出:B_static

       B c = new B();
       a.test2();  //输出:A
       b.test2();  //输出:A   方法重写
       c.test2();  //输出:B

       /**
        * 静态方法和非静态方法有区别。
        */
  }
}

 

多态

动态编译:类型,可扩展性

同一方法可以根据发送对象的不同而采取多种不同的行为方式。

一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多。

多态存在的条件:

  1. 有继承关系。

  2. 子类重写父类方法。

  3. 父类指向子类对象。

注意:多态是方法的多态,属性没有多态。

package charpter5.Demo08;

public class Person {

   public void run(){
       System.out.println("Person_run");
  }

}
package charpter5.Demo08;

public class Student extends Person{
   public void run(){
       System.out.println("Student_run");
  }

   public void eat(){
       System.out.println("eat");
  }

}
package charpter5.Demo08;

public class App {
   public static void main(String[] args) {
       //一个对象的实际类型是确定的
       //new Student();
       //new Person();

       Student s1 = new Student();
       //父类的引用指向子类的类型
       Person s2 = new Student();
       //只能调用父类有的方法,子类重写,调用子类,未重写,调用父类。
       Object s3 = new Student();

       s2.run();

       //s2.eat(); 报错,父类没有该方法
       //强制类型转换,可以访问。
      ((Student)s2).eat();   //输出:eat

       /**
        * 多态是方法的多态,属性没有多态
        * 父类和子类才行,类型转换异常ClassCastException
        * 存在条件:继承关系、有方法重写、父类引用指向子类对象。
        *
        * 1.final不能重写
        * 2.private不能重写
        * 3.static不能重写
        */

  }
}

 

instanceof与类型转换

关键词:instanceof 引用类型转换

package charpter5.Demo08;

public class App {
   public static void main(String[] args) {

       Student s1 = new Student();
       Person s2 = new Student();
       Object s3 = new Student();
       System.out.println(s3 instanceof Person);
       System.out.println(s3 instanceof Student);
       /**
        * true
        * true
        * 判断类型是否相关,父子关系在一条线上为true 否则为false
        * 同级编译报错。
        */

       //类型转换
       /**
        * 父类为高,子类为低
        * 高转低用强制转换   向下转型   丢失部分方法
        * 低转高可以默认   向上转型
        * 方便方法的调用。
        */
      ((Student)s2).eat();
  }
}
 

标签:java,子类,void,特性,Student,println,父类,public,三大
From: https://www.cnblogs.com/ssl-study/p/16734126.html

相关文章

  • 免费综合网络研讨会:如何优化 JavaScript 应用程序的方法
    免费综合网络研讨会:如何优化JavaScript应用程序的方法您是否考虑过提高JavaScript应用程序的性能?加入DmytroMezhenskyi,开发专家解码前端,上2022年9月30......
  • 【Echarts】用java在后台生成图片
    一、场景需求前端不用等待获取数据渲染echarts图表,直接请求后台,获取echarts图表的base64编码,生成本地图片。二、使用工具1.下载:Phantomjs:https://phantomjs.org/download.......
  • Exception in thread "main" java.lang.UnsupportedClassVersionError:
    报错:Exceptioninthread"main"java.lang.UnsupportedClassVersionError:********AppWebApplicationhasbeencompiledbyamorerecentversionoftheJavaRuntim......
  • JavaScript入门到精通
    JavaScript参考文章:https://www.yuque.com/u21195183/phhed3https://developer.mozilla.org/zh-CN/docs/Learn/JavaScripthttps://www.w3school.com.cn/js/index.asp......
  • JavaWeb--HTML & CSS--2022年9月27日
    第一节  HTML--w3school网站可学习1、快速入门A、总结HTML文件以.htm或者.html为扩展名HTML结构标签  ......
  • Convert gif to Base64 String Using JavaScript
    letxhRequest=newXMLHttpRequest();xhRequest.onload=function(){letreader=newFileReader();reader.onloadend=function(){......
  • Java泛型的总结
    泛型可以用于接口、类、方法上。还有泛型通配符这个概念泛型的好处:可以在编译时检查1.用于方法中,指定该方法中的形参的类型。语法:修饰符<代表泛型的变量>返回值类型......
  • Java Stream常用代码
    //过滤数据List<TestVo>list=list.stream().filter(x->NumberUtil.isLessOrEqual(x.getPrice(),testVo.getPrice())).collect(Collectors.toLis......
  • JavaWeb的servlet的doGet,doPost方法
    packagetop.lostyou.servlet;importcom.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;importjavax.servlet.ServletException;importjavax.servlet.ht......
  • java有参的构造方法和无参的构造方法
    转:java有参的构造方法和无参的构造方法如果编写一个java程序时没有添加无参构造方法,那么编译器会自动添加无参构造方法;但是如果编写时添加了有参构造方法而未添加无参构造......