1.父类方法使用private声明可以进行覆写吗?
答:不可以。
class A{
public void fun(){
this.print();
}
private void print(){
System.out.println("111");
}
}
class B extends A{
public void print(){
System.out.println("222");
}
}
public class TestDemo {
public static void main(String[] args) {
B b = new B();
b.fun();
}
}
运行结果:111
这里无论B类中的方法使用public,default或者private,输出结果都一样。利用快捷键在B类中选择重写方法,没有选择重写A类中的print方法的,所以不可以覆写父类中的private声明的方法。子类中的这个方法相当于定义了一个新的方法,这一方法与父类无关。
2.父子类对象的转换
-向上转型:子类对象变为父类对象(自动转换)
格式:父类 父类对象 = 子类实例
目的:参数统一,但是通过子类实例化后的父类对象所能调用的方法只能是父类中定义过的方法。
结果为由父类对象调用方法,根据子类是否覆写了父类中的方法来执行,如果子类覆写了,那么调用的是子类覆写过的方法。,否则调用父类中定义的方法。但是对象一旦向上转型,那么就无法调用子类原本的特有的方法和属性。
-向下转型:父类对象变为子类对象(强制转换)
格式:子类 子类对象 = (子类)父类实例
目的:父类对象要调用实例化它的子类中的特殊方法, 前提条件是必须发生向上转型后才可以发生向下转型,容易带来安全隐患。
向下转型过程中要注意的是:
情况一:如果父类引用的对象引用的是指向的子类对象,那么在向下转型的过程中是安全的,也就是编译是不会出错误的。**
情况二:如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.classcastException的错误,可以使用instanceof来避免出此类错误。
---------------------**
作者:littleAsuna
来源:CSDN
原文:https://blog.csdn.net/baidu_26954625/article/details/90581757
java.lang.classcastException指的是类转换异常,指的是两个没有关系的类对象强制发生向下转型时所带来的异常。
对象 instanceof 类 返回Boolean型
如果某个对象是某个类的实例,则返回true,否则返回false。
基本的向上转型和向下转型:
class A{
public void print(){
System.out.println("1");
}
}
class B extends A{
public void print(){
System.out.println("2");
}
}
class C extends A{
public void print(){
System.out.println("3");
}
}
public class TestDemo {
public static void main(String[] args) {
//只要是A类的子类都可以使用向上转型,由A类接收
A a1 = new B(); //向上转型
A a2 = new C(); //向上转型
B b1 = (B) a1; //向下转型
a1.print();
a2.print();
b1.print();
}
}
向下转型调用子类中的特殊功能:
class A{
public void print(){
System.out.println("1");
}
}
class B extends A{
public void print(){
System.out.println("2");
}
public void funB(){
System.out.println("B扩充的方法");
}
}
public class TestDemo{
public static void main(String[] args) {
fun(new B());
}
private static void fun(A a) { //统一参数
if(a instance of B){
B b = (B) a; //因为要调用子类的特殊功能,需要向下转型
b.funB(); //调用子类扩充的方法
}
}
}
3.public class和class的区别
public class:文件名称必须与类名称保持一致在一个.java文件中只能有一个public class声明,可以被不同的包访问。
class:文件名称与类名称可以不一致,一个.java文件中可以有多个class定义,编译后会形成多个.class文件,只能被此类所在的包访问。
4.java命名规范
类名称:每个单词的开头首字母大写。
变量/方法:第一个单词的首字母小写,之后每个单词的首字母大写。
常量名称:每个字母大写。
包名称:所有字母小写。
5.单例设计模式与多例设计模式
单例设计模式(只有一个实例化对象):
类中的全部属性应该封装,封装后要想取得属性则要编写getter方法,这时getter方法应该由类名称直接调用,且为static,static定义的属性特点是由类名称直接调用,且在没有实例化对象的时候可以调用。
class Singleton{
private final static Singleton instance = new Singleton();
private Singleton(){
//构造方法私有化
}
public void print(){
System.out.println("hello world!");
}
public static Singleton getInstance() { //取得本类的对象
return instance;
}
}
public class SingletonTestDemo {
public static void main(String[] args) {
Singleton inst = null; //声明对象
inst = Singleton.getInstance();
inst.print();
}
}
多例设计模式(多个对象):
class Sex{
private String title;
private static final Sex MALE = new Sex("男");
private static final Sex FEMALE = new Sex("女");
private Sex(String title) {
this.title = title;
}
@Override
public String toString() {
return this.title;
}
public static Sex getInstance(String ch){
switch(ch){
case "man":
return MALE;
case "female":
return FEMALE;
default:
return null;
}
}
}
public class 多例设计模式 {
public static void main(String[] args) {
Sex sex = Sex.getInstance("man");
System.out.println(sex);
}
}